2013-10-23 13 views
8

Ich möchte ein Bild von meinem ImageView in Dateien mit unterschiedlichen Auflösungen speichern. Tun Sie es als .png Ergebnisse wie erwartet. Wie für .jpg - Ich bekomme alle Dateien rosa getönt.Bild in JavaFX als JPG gespeichert ist rosa getönt

should be blue

Wo ist der Trick? Hier ist der Code:

Object[] imagesFromFotoListView = ta.myFotoListView.getItems().toArray(); 
new File(localDir).mkdirs(); 
for (int i = 0; i < imagesFromFotoListView.length; i++) { 
    new File(localDir + "/" + i).mkdirs(); 
    final ImageView iv = new ImageView((Image) imagesFromFotoListView[i]); 
    ImageIO.write(SwingFXUtils.fromFXImage(iv.snapshot(null, null), null), "jpg", new File(localModelFotoDir + "/" + i + "/large.jpg")); // JPG THAT FAILS PINK. 
    BufferedImage bi = SwingFXUtils.fromFXImage(iv.snapshot(null, null), null); 
    int resolution[] = new int[]{500, 250, 75}; 
    for (int j = 0; j < resolution.length; j++) { 
     BufferedImage resizedBImage; 
     if (bi.getWidth() == bi.getHeight()) { 
      resizedBImage = resizeBufferedImage(bi, Scalr.Method.ULTRA_QUALITY, Scalr.Mode.AUTOMATIC, resolution[j], resolution[j]); 
     } else if (bi.getWidth() > bi.getHeight()) { 
      resizedBImage = resizeBufferedImage(bi, Scalr.Method.ULTRA_QUALITY, Scalr.Mode.AUTOMATIC, resolution[j], (int) ((double) resolution[j] * bi.getHeight()/bi.getWidth())); 
     } else { 
      resizedBImage = resizeBufferedImage(bi, Scalr.Method.ULTRA_QUALITY, Scalr.Mode.AUTOMATIC, (int) ((double) resolution[j] * bi.getWidth()/bi.getHeight()), resolution[j]); 
     } 
     Image resizedI = (Image) SwingFXUtils.toFXImage(resizedBImage, null); 
     ImageIO.write(SwingFXUtils.fromFXImage((Image) SwingFXUtils.toFXImage(resizedBImage, null), null), "png", new File(localModelFotoDir + "/" + i + "/" + resolution[j] + ".png")); // PNG THAT GOES WELL 
    } 
} 

Antwort

15

Ich habe eine Lösung in Oracle-Foren gefunden. Wie weit diskutiert, ist das Problem in Alpha-Kanal, die aus dem Quellbild ausgeschlossen werden muss, Ziel für .jpg speichern. Ich habe meinen Code auch neu angeordnet, um ihn kürzer zu machen. Die Abhilfe ist:

// Get buffered image: 
BufferedImage image = 
    SwingFXUtils.fromFXImage(
    myJavaFXImage, 
    null); 

// Remove alpha-channel from buffered image: 
BufferedImage imageRGB = 
    new BufferedImage(
    image.getWidth(), 
    image.getHeight(), 
    BufferedImage.OPAQUE); 

Graphics2D graphics = imageRGB.createGraphics(); 

graphics.drawImage(
    image, 
    0, 
    0, 
    null); 

ImageIO.write(
    imageRGB, 
    "jpg", 
    new File(
    "/mydir/foto.jpg")); 

graphics.dispose(); 

in Java 8 Fixed: https://bugs.openjdk.java.net/browse/JDK-8114609

1

aktualisieren

Dieses Problem für Java wurde behoben 8:

JDK-8114609 Incorrect display of JPEG images


Es sieht aus wie Sie vorhandene Fehler in der ImageIO begegnen oder JavaFX Bildverarbeitungsbibliotheken.

Vielleicht möchten Sie in den unten stehenden Stackoverflow Fragen vorgeschlagen einige der Abhilfen, um zu versuchen und sehen, ob einer von ihnen das Problem zu beheben für Sie:

+0

Der erste Link ist nicht öffentlich, es erfordert Authentifizierung. – leonbloy

+0

Ja leonbloy, aber [jeder kann sich anmelden, indem er auf der Authentifizierungsseite auf den Link Anmelden klickt] (https://javafx-jira.kenai.com/browse/RT-14647) und dann alle Probleme im JavaFX-Issue-Tracker anzeigen . – jewelsea

+0

Ich habe Ihre [pngj] (https://code.google.com/p/pngj/) Bibliothek leonbloy bemerkt, vielleicht können Sie [Oracle bei der Reparatur helfen] (https://wiki.openjdk.java.net/display/OpenJFX/Main), sicherlich [möchte Hilfe] (https://wiki.openjdk.java.net/display/OpenJFX/Owners+Wanted) mit Bildverarbeitung. Wenden Sie sich bei Interesse an die [openjfx-dev-Mailingliste] (http://mail.openjdk.java.net/mailman/listinfo/openjfx-dev). – jewelsea