2016-05-11 9 views
0

Mit javafx, wenn ich Bilder lese PixelFormat ist rgb und ich möchte Filter auf sie anwenden. Ich benutze witableImage.pixelWriter, um die Pixel Farbe, aber das PixelFormat ist rgba.Wie setze ich PIxelFormat in javafx auf rgb?

Ich benutze ImageIO.write() und es funktioniert für. Png, aber wenn ich versuche, dieses geänderte Bild in .jpg oder .jpeg zu speichern, ändert sich die Farbe. Ich finde das, weil rgba nicht mit jpg arbeitet, aber ich weiß nicht, wie ich dieses PixelFormat ändern kann.

Gibt es eine Möglichkeit, das rgba-Format in rgb zu ändern? Kennen Sie eine andere Möglichkeit, javafx Image als .jpg/.jpeg zu speichern?

Edit: Wie ich Datei zu speichern (es funktioniert für png)

fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("JPG Files", "*.jpg")); 
File outputFile = fileChooser.showSaveDialog(null); 
BufferedImage bImage = SwingFXUtils.fromFXImage(modifiedImage.getImage(), null); // getImage() return a javafx.scene.image.Image; 
try { 
      ImageIO.write(bImage, "jpg", outputFile); 
} catch (IOException e) { 
      throw new RuntimeException(e); 
} 

Wie ich Bild ändern (Beispiel)

Image currentImage = modifiedImage.getImage(); 
WritableImage writableImage = new WritableImage((int) currentImage.getWidth(), (int) currentImage.getHeight()); 
PixelReader pixelReader = currentImage.getPixelReader(); 
PixelWriter pixelWriter = writableImage.getPixelWriter(); 

for (int i = 0; i < (int) currentImage.getWidth(); i++) { 
     for (int j = 0; j < (int) currentImage.getHeight(); j++) {  
      pixelWriter.setColor(i, j, new Color(0,0,0,1)); 
     } 
} 
modifiedImage.setImage(writableImage); 

Als ich das Pixelformat des Lesers zu bekommen ist es rgb aber für die Schriftsteller es ist rgba. Wenn ich ein Bild ohne Änderung speichere, ist es gut, aber wenn ich einen Filter darauf anwende und das Bild als JPG speichere, ändern sich die Farben.

Auf meiner App sind die Farben gut, aber wenn ich die jpg-Datei außerhalb öffnen, sind sie nicht. Mit PNG-Dateien gibt es kein Problem. Ich kann erlauben, nur als png zu speichern, aber es wäre besser, wenn ich wählen könnte.

Lösung:

BufferedImage bImage = SwingFXUtils.fromFXImage(modifiedImage.getImage(), null); 
BufferedImage bImage2 = new BufferedImage(bImage.getWidth(), bImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR); 
bImage2.getGraphics().drawImage(bImage, 0, 0, null); 
try { 
    ImageIO.write(bImage2, "jpg", outputFile); 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 
+0

Könnten Sie Code bereitstellen, wie Sie ImageIO verwenden, um die Pixel zu schreiben? Grundsätzlich ist das 'a' in rgba 'a' der Alphakanal. Wenn Sie rgb wollen, benutzen Sie einfach die Kanäle 'r', 'g' und 'b' und überspringen Sie den Alpha-Kanal. Nicht sicher, ob ich deine Frage richtig verstanden habe. – Markus

Antwort

2

Sie sind wieder eine der vielen Menschen, die https://bugs.openjdk.java.net/browse/JDK-8119048 von diesem Fehler betroffen sind, die fest ist nicht wichtig genug, um in Betracht gezogen werden. Wenn Sie die Kommentare dort lesen, finden Sie eine Arbeitsumgebung. Grundsätzlich besteht die Idee darin, das Bild nach der Konvertierung in ein neues Bild ohne Alpha-Kanal zu kopieren. Ich würde wirklich gerne wissen, wie viel mehr Leute ihre Zeit verschwenden müssen, bis dieser Bug endlich genug Aufmerksamkeit bekommt, um behoben zu werden.

+0

Danke für den Link, es funktioniert jetzt. – Masttest

Verwandte Themen