【问题标题】:Image saved in JavaFX as jpg is pink toned在 JavaFX 中保存为 jpg 的图像是粉红色的
【发布时间】:2013-10-23 17:24:53
【问题描述】:

我想将 ImageView 中的图像保存到具有不同分辨率的文件中。将其作为 .png 结果按预期进行。至于 .jpg - 我把所有文件都调成粉红色。

诀窍在哪里?代码如下:

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
    }
}

【问题讨论】:

    标签: image save png javafx jpeg


    【解决方案1】:

    我在 Oracle 论坛上找到了解决方案。正如广泛讨论的那样,问题在于 alpha 通道,需要从源图像中排除,目标是 .jpg 保存。我还重新排列了我的代码以使其更短。解决方法是:

    // 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();
    

    在 Java 8 中修复:https://bugs.openjdk.java.net/browse/JDK-8114609

    【讨论】:

      【解决方案2】:

      更新 JavaFX 17

      我用 JavaFX 17 再次尝试了这个,除非我使用 top-rated answer 中的解决方法,否则我无法再保存图像。在我的情况下,它只会输出一个长度为 0 的文件,甚至不会输出之前被破坏时丑陋的粉红色文件。

      更新

      此问题已针对 Java 8 修复:

      JDK-8114609 Incorrect display of JPEG images


      您似乎遇到了 ImageIO 或 JavaFX 图像处理库中的现有错误。

      您可能希望尝试以下 StackOverflow 问题中建议的一些解决方法,看看它们中的任何一个是否为您解决了问题:

      【讨论】:

      猜你喜欢
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2017-08-19
      • 2022-01-01
      • 2011-01-11
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多