2013-10-23 22 views
8

Bir Image ImageView'umdan farklı çözünürlüklerdeki dosyalara kaydetmek istiyorum. .png olarak beklendiği gibi sonuç bekleniyor. .jpg'ye gelince - tüm dosyaları pembe tonlu alıyorum. hile neredeJpg olarak görüntü kaydedilen resim jpg pembe tonlu

should be blue

mı?

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

cevap

15

Oracle forumlarında bir çözüm buldum. Yaygın olarak tartışıldığı gibi, sorunu, .jpg kayıt için hedeflenen kaynak görüntüden dışlanması gereken alfa-kanal'dur. Ayrıca daha kısa yapmak için kodumu yeniden düzenledim. geçici çözüm:

// 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'de Sabit: https://bugs.openjdk.java.net/browse/JDK-8114609

1

Güncelleme Bu sorun Java 8 için sabit olduğunu

: Eğer ImageIO mevcut hataları karşılaşmak gibi

JDK-8114609 Incorrect display of JPEG images


görünüyor İşte kod veya JavaFX Görüntü işleme kütüphaneleri.

+0

ilk bağlantı kamu değil, kimlik doğrulaması gerektiriyor. – leonbloy

+0

Evet leonbloy, ama [herkes kimlik doğrulaması sayfasındaki Kayıt Ol bağlantısını tıklayarak kaydolabilir] (https://javafx-jira.kenai.com/browse/RT-14647) ve daha sonra JavaFX sorunu izleyicisindeki tüm sorunları görüntüleyebilir . – jewelsea

+0

[pngj] (https://code.google.com/p/pngj/) kütüphane leonbloy'unuzu fark ettim, belki de [Oracle'ın bu işleri düzeltmesine yardımcı olabilirsiniz] (https://wiki.openjdk.java.net/display/OpenJFX/Main), görüntü işleme ile kesinlikle [yardım isterler] (https://wiki.openjdk.java.net/display/OpenJFX/Owners+Wanted). Ilgilenirseniz [openjfx-dev postalama listesi] (http://mail.openjdk.java.net/mailman/listinfo/openjfx-dev) başvurun. – jewelsea