2D-Grafik LookupOp Operation auf BufferedImage

Mindstream

Aktives Mitglied
Hallo,

Ich möchte eine ImageIcon Instanz highlighten, wenn die Maus darüber liegt. Ich habe etwas herumexperimentiert und hatte vor das jeweilige Bild mithilfe einer invertierbaren LookupOp zu verändern.
Dazu brauche ich jedoch ein BufferedImage. Und es scheint praktisch unmöglich zu sein aus meinem ImageIcon ein BufferedImage zu machen, welches mit LookupOp zusammen funktioniert.
Ich bekomme dabei folgenden Fehler:
java.lang.IllegalArgumentException: Number of channels in the src (4) does not match number of channels in the destination (2)
at java.awt.image.LookupOp.filter(LookupOp.java:273)

Habt ihr eine Idee, wie ich LookupOp.filter auf mein ImageIcon anwenden kann? Oder bekommt man die URL des ImageIcon heraus? Vielleicht kann man damit ein entsprechendes BufferedImage erzeugen.

Noch lieber wäre mir aber eine einfache library Funktion, die direkt auf image arbeitet.

Danke,
Mindstream
 
Zuletzt bearbeitet von einem Moderator:

Mindstream

Aktives Mitglied
Hmm, also das Problem ist nicht das Image in ein BufferedImage zu konvertieren. Folgender Code wirft den selben Fehler.
deepCopy(): java - How do you clone a BufferedImage - Stack Overflow
Java:
img = ImageIO.read(AbstractNubiSaveComponent.class.getResource("/images/NubiSaveComponent.png");
short[] invert = new short[256];
short[] straight = new short[256];
for (int i = 0; i < 256; i  ) {
  invert[i] = (short)(255 - i);
  straight[i] = (short)i;
}
short[][] blueInvert = new short[][] { straight, straight, invert };
BufferedImageOp blueInvertOp = new LookupOp(new ShortLookupTable(0, blueInvert), null);
BufferedImage highlighted = blueInvertOp.filter(img, deepCopy(img));

Wieso sind die BufferedImages nicht kompatibel?
 

Marco13

Top Contributor
Du solltest/könntest/mußt dem ImageIcon direkt ein BufferedImage geben (im Konsruktor), das du vorher mit ImageIO erstellt hast. Vielleicht solltest du das BufferedImage sogar komplett per Hand, mit "new BufferedImage" (wo dann das eigentliche Bild reingemalt wird). Poste ggf. mal mehr Code - und probier' ggf. erstmal, NUR die LookupOp zum Lufen zu kriegen.

Ah, da hätte ich mal "reload" drücken sollen: Versuch' mal, so wie hier http://www.java-forum.org/spiele-mu...18-performance-bufferedimages.html#post803128 zwei BufferedImages (mit dem Inhalt des eigentlichen Bildes) vom gleichen Typ zu erstellen.
 

Mindstream

Aktives Mitglied
Hi Marco,

Ich bekomme den gleichen Fehler. Außerdem habe ich nun das hier probiert:
Java:
BufferedImage image = null, image2 = null;
try {
	image = ImageIO.read(AbstractNubiSaveComponent.class.getResource("/images/ProvidedPort.png"));
	image2 = ImageIO.read(AbstractNubiSaveComponent.class.getResource("/images/ProvidedPort.png"));
} catch (IOException e1) {
	// TODO Auto-generated catch block
	e1.printStackTrace();
}
short[] invert = new short[256];
short[] straight = new short[256];
for (int i = 0; i < 256; i  ) {
  invert[i] = (short)(255 - i);
  straight[i] = (short)i;
}
short[][] blueInvert = new short[][] { straight, straight, invert };
BufferedImageOp blueInvertOp = new LookupOp(new ShortLookupTable(0, blueInvert), null);
blueInvertOp.filter(image, image2);


Ich ändere mal den Titel.
[EDIT] geht anscheinend nicht; ich würde das Thema sonst in LookupOp Operation auf BufferedImage umbenennen
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Wenn man ein PNG mit ImageIO lädt, weiß man nicht, welchen Typ es hat, und demnach auch kaum, welche LookupOp man darauf anwenden soll. Hast du mal versucht, es wie beschrieben umzuwandeln? Ein KSKB zu deinem Lookup-Op-Test?
 

Mindstream

Aktives Mitglied
Hallo,

Ja, wie gesagt habe ich deinen Vorschlag umgesetzt und es hat die selbe Fehlermeldung geworfen. Hier das entsprechend abgewandelte Beispiel Programm:
Java:
public static void main(String[] args) throws IOException{

	BufferedImage image = null, image2 = null;
	image = ImageIO.read(new File("/home/joe/projects/eclipse_ws/graph/src/images/ProvidedPort.png"));
	image2 = ImageIO.read(new File("/home/joe/projects/eclipse_ws/graph/src/images/RequiredPort.png"));
	short[] invert = new short[256];
	short[] straight = new short[256];
	for (int i = 0; i < 256; i++) {
	  invert[i] = (short)(255 - i);
	  straight[i] = (short)i;
	}
	short[][] blueInvert = new short[][] { straight, straight, invert };
	BufferedImageOp blueInvertOp = new LookupOp(new ShortLookupTable(0, blueInvert), null);
	image2 = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
	Graphics2D g = image2.createGraphics();
	g.drawImage(image, 0, 0, null);
	g.dispose();
	blueInvertOp.filter(image2, image2);	
}
 

Marco13

Top Contributor
Java:
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.LookupOp;
import java.awt.image.ShortLookupTable;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;


public class LookupTest
{
    public static void main(String[] args) throws IOException
    {
        final BufferedImage image = loadImageARGB("vegetax.png");
        
        BufferedImageOp blueInvertOp = createBlueInvertARGB();
        blueInvertOp.filter(image, image);

        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.getContentPane().setLayout(new GridLayout());
                f.getContentPane().add(new JLabel(new ImageIcon(image)));
                f.setSize(400,400);
                f.setVisible(true);
                
            }
        });
    }

    private static BufferedImage loadImageARGB(String filename) throws IOException
    {
        BufferedImage image = ImageIO.read(new File(filename));
        BufferedImage result = 
            new BufferedImage(image.getWidth(), image.getHeight(), 
                BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = result.createGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return result;
    }
    
    private static BufferedImageOp createBlueInvertARGB()
    {
        short[] invert = new short[256];
        short[] straight = new short[256];
        for (int i = 0; i < 256; i++) {
          invert[i] = (short)(255 - i);
          straight[i] = (short)i;
        }
        short[][] blueInvert = new short[][] { straight, straight, invert, straight };
        BufferedImageOp blueInvertOp = new LookupOp(new ShortLookupTable(0, blueInvert), null);
        return blueInvertOp;
    }
    
}

:noe:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
S Swing DnD: Image während Drag-Operation ändern AWT, Swing, JavaFX & SWT 3
J Designfrage bei rechenintensiver Operation AWT, Swing, JavaFX & SWT 7
hdi non-default close operation bei JDialog AWT, Swing, JavaFX & SWT 2
I Arbeitsspeicherverbrauch BufferedImage.TYPE_INT_RGB vs. TYPE_3BYTE_BGR AWT, Swing, JavaFX & SWT 6
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
I GEmaltes BufferedImage löschen AWT, Swing, JavaFX & SWT 3
cool_brivk24 BufferedImage einem ClickEvent hinzufügen AWT, Swing, JavaFX & SWT 13
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
G Subimage von BufferedImage speichern AWT, Swing, JavaFX & SWT 4
D JPanel Graphic2D als BufferedImage Speichern AWT, Swing, JavaFX & SWT 5
D BufferedImage -> Feature Extraktion. Unterschiedliche BufferedImage imageTypes problem AWT, Swing, JavaFX & SWT 4
I 2D-Grafik Shape aus BufferedImage "löschen" AWT, Swing, JavaFX & SWT 2
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
P BufferedImage schlechte Qualität beim Abspeichern AWT, Swing, JavaFX & SWT 9
S BufferedImage als schwarz-weiß-Bild AWT, Swing, JavaFX & SWT 3
Luk10 BufferedImage[...].getData() vs BufferedImage.setRGB() AWT, Swing, JavaFX & SWT 2
D Schnelles kopieren von Pixeln in ein BufferedImage AWT, Swing, JavaFX & SWT 25
J Flackern wie mit BufferedImage beheben AWT, Swing, JavaFX & SWT 4
N Swing BufferedImage neu laden AWT, Swing, JavaFX & SWT 10
N 2D-Grafik BufferedImage, Line2D, Swing und die Probleme AWT, Swing, JavaFX & SWT 5
Luk10 BufferedImage auf ein anderes BufferedImage zeichnen AWT, Swing, JavaFX & SWT 6
P BufferedImage auf JPanel AWT, Swing, JavaFX & SWT 11
K 2D-Grafik BufferedImage eingelesen, welches Modell?! AWT, Swing, JavaFX & SWT 2
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
0x7F800000 2D-Grafik int[] zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 27
H 2D-Grafik BufferedImage aus Integer-Array AWT, Swing, JavaFX & SWT 3
Luk10 2D-Grafik BufferedImage sauber rotieren AWT, Swing, JavaFX & SWT 16
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
A BufferedImage nach dem Speichern immer schwarz AWT, Swing, JavaFX & SWT 8
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4
E BufferedImage Alphaknal ein- und ausblenden AWT, Swing, JavaFX & SWT 7
N BufferedImage zeichnen AWT, Swing, JavaFX & SWT 4
D BufferedImage Größe skalieren AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
E AWT RenderedImage aus BufferedImage erzeugen, um Bild abzuspeichern? AWT, Swing, JavaFX & SWT 4
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
A 2D-Grafik BufferedImage wird nicht eingezeichnet AWT, Swing, JavaFX & SWT 3
G 2D-Grafik BufferedImage Hintergrund immer schwarz AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
J AWT BufferedImage to 2DArray AWT, Swing, JavaFX & SWT 10
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
J JPanel in Bufferedimage AWT, Swing, JavaFX & SWT 3
1 BufferedImage in byte[], dann in String und zurück AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
C BufferedImage-Fehler? Falsches Bild wir gezeichnet AWT, Swing, JavaFX & SWT 5
B BufferedImage Builder AWT, Swing, JavaFX & SWT 15
F Transparentes BufferedImage über BufferedImage AWT, Swing, JavaFX & SWT 12
F Größe von BufferedImage ändern AWT, Swing, JavaFX & SWT 27
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
Dragonfire Swing Zoom-Vorgang optimieren [BufferedImage] AWT, Swing, JavaFX & SWT 2
2 Memory Leak mit BufferedImage !! AWT, Swing, JavaFX & SWT 15
X BufferedImage maximiert in JFrame anzeigen? AWT, Swing, JavaFX & SWT 2
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
R Zeichnen von Zahlen in BufferedImage AWT, Swing, JavaFX & SWT 6
G BufferedImage.getRGB() mit 3 int-Werten vergleichen AWT, Swing, JavaFX & SWT 2
Luma BufferedImage wird nicht gezeichnet AWT, Swing, JavaFX & SWT 3
G keine ScaledInstance von BufferedImage? AWT, Swing, JavaFX & SWT 6
S BufferedImage & Scaling: Altes Problem im neuen Gewand AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
G BufferedImage und jpg --> maximale Qualität AWT, Swing, JavaFX & SWT 9
F HTML Text irgendwie auf BufferedImage bringen AWT, Swing, JavaFX & SWT 3
R BufferedImage Problem AWT, Swing, JavaFX & SWT 2
G Problem mit BufferedImage und imageIO AWT, Swing, JavaFX & SWT 2
S BufferedImage drehen AWT, Swing, JavaFX & SWT 3
? ActionListener auf BufferedImage AWT, Swing, JavaFX & SWT 11
M BufferedImage mit html interpretierten String beschriften AWT, Swing, JavaFX & SWT 3
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
B Farbtiefe eines BufferedImage verringern AWT, Swing, JavaFX & SWT 3
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
F Animiertes Gif als BufferedImage AWT, Swing, JavaFX & SWT 10
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
C Rotate BufferedImage --> Bild unvollständig AWT, Swing, JavaFX & SWT 5
U Streifen hinter bewegtem BufferedImage AWT, Swing, JavaFX & SWT 13
M BufferedImage skalieren AWT, Swing, JavaFX & SWT 6
T BufferedImage verkleinern Resultat ist zu pixelig. AWT, Swing, JavaFX & SWT 6
G Image Object speichern oder in ein BufferedImage umwandeln AWT, Swing, JavaFX & SWT 2
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
B BufferedImage aus einer Datei AWT, Swing, JavaFX & SWT 4
C Farben in BufferedImage ändern ? AWT, Swing, JavaFX & SWT 2
J Image to BufferedImage AWT, Swing, JavaFX & SWT 5
T BufferedImage kopieren AWT, Swing, JavaFX & SWT 3
T BufferedImage Farbe "Transparent" AWT, Swing, JavaFX & SWT 21
T BufferedImage + bestimmten bereich ausfüllen AWT, Swing, JavaFX & SWT 3
M BufferedImage Größe? AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben