Image 图像保存在JavaFX中,jpg为粉色

Image 图像保存在JavaFX中,jpg为粉色,image,save,png,javafx,jpeg,Image,Save,Png,Javafx,Jpeg,我想将图像从ImageView保存到具有不同分辨率的文件中。按.png格式执行,结果与预期一致。至于.jpg,我把所有的文件都改成粉红色 诀窍在哪里?代码如下: Object[] imagesFromFotoListView = ta.myFotoListView.getItems().toArray(); new File(localDir).mkdirs(); for (int i = 0; i < imagesFromFotoListView.length; i++) {

我想将图像从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
    }
}
Object[]imagesFromFotoListView=ta.myFotoListView.getItems().toArray();
新文件(localDir.mkdirs();
对于(int i=0;ibi.getHeight()){
resizedBImage=resizeBufferedImage(bi,Scalr.Method.ULTRA_QUALITY,Scalr.Mode.AUTOMATIC,分辨率[j],(int)((双)分辨率[j]*bi.getHeight()/bi.getWidth());
}否则{
resizedBImage=resizeBufferedImage(bi,Scalr.Method.ULTRA_QUALITY,Scalr.Mode.AUTOMATIC,(int)((双)分辨率[j]*bi.getWidth()/bi.getHeight()),分辨率[j]);
}
Image resizedI=(Image)SwingFXUtils.toFXImage(resizedBImage,null);
ImageIO.write(SwingFXUtils.fromFXImage((Image)SwingFXUtils.toFXImage(resizedBImage,null),null),“png”,新文件(localmodelfotdir+“/”+i+“/”+分辨率[j]+“.png”);///png运行良好
}
}
更新

此问题已针对Java 8修复:


看起来您在ImageIO或JavaFX图像处理库中遇到了现有的bug

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


我在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中修复:

第一个链接不是公开的,它需要身份验证。是的,leonbloy,但是,然后在JavaFX问题跟踪程序中查看所有问题。我注意到你的库leonbloy,也许你可以,它们肯定与图像处理有关。如果有兴趣,请联系。