2012-10-25 20 views
13

görüntülerini okumak ve yazmak için javax.imageio.ImageIO uygulamasında ImageIO.read() ve ImageIO.write() yöntemlerini kullanıyorum. ve bazı görüntülerin renginin garip şekilde değiştiğini keşfettim.jpeg resim rengi, yalnızca ImageIO.read() ve ImageIO.write()

Kodumu hiçbir şey yapmayacak şekilde değiştirdiğimde, yalnızca görüntüleri okuyarak ve yazarak (jpeg, png, gif ile) yazsam bile, tüm bu yeni görüntüler aynı sorunla karşılaşır.

ImageIO.read/write yöntemleri öncesi/sonrası başka bir kod eklemem gerekir mi?

File f = new File("obw.jpg"); 
    BufferedImage bi = ImageIO.read(f); 
    FileOutputStream fos2 = new FileOutputStream("obw2.jpg"); 
    ImageIO.write(bi, "JPG", fos2); 
    FileOutputStream fos3 = new FileOutputStream("obw3.gif"); 
    ImageIO.write(bi, "GIF", fos3); 
    FileOutputStream fos4 = new FileOutputStream("obw4.png"); 
    ImageIO.write(bi, "PNG", fos4); 

My çevre:

java version "1.6.0_35" 
    MacOSX 10.8.2 

Orjinal Resim: sonra okuma ve yazma görüntülerin enter image description here

Bir:

enter image description here İşte

benim kullandığım kodudur

+0

Hangisi değişti, yoksa hepsi mi? orijinal görüntü belki de * bozuk *? –

+0

http://stackoverflow.com/questions/2408613/problem-reading-jpeg-image-using-imageio-readfile-file – Lesto

+0

Orijinal görüntüyü okudum ve jpeg, png, gif resimleri yazdı ve üç gösteriyi yeşil obivan yazdı Orijinal resmin bozuk olup olmadığını kontrol etmenin bir yolu var mı? – UGO

cevap

22

Sorununuz, ImageIO'nun JPEG'nizdeki YCbCr verilerini RBG verileri olarak yanlış yorumlamasıdır. İlgili Java hataları 4712797 ve 4776576, Oracle'ın yanlış bir şekilde Java 1.4'te verildiğini iddia ediyor, ancak gerçekte bazı Java 5, 6 ve 7 JVM'leri hala etkiliyor.

Çalıştığım bir projede, ImageIO'nun düzgün şekilde yüklenip yüklenmediğini görmek için özel olarak yapılandırılmış bir test JPEG with a single black pixel yükleyerek bu sorunla uğraştık. Piksel yeşile dönerse, ImageIO görüntü verilerini yanlış yorumluyor, bu yüzden JPEG'leri daha sonra yüklediğimizde ve problemin neden olduğu JPEG türünü tespit ettiğimizde, renk düzeltmesi de uyguluyoruz. (Bunu gösteren JVM'lerde sorunu tetikleyen JPEG türü, belirli bir alt örnekleme ve JFIF belirteci içermez.)

Sorunla ilgilenen bazı LGPLv2-licensed code. Dünyanın geri kalanının tamamını JPEG'leri düzgün bir şekilde yüklemeyi başardığı zaman, düzinelerce yıllarca bulan böceklerin üzerinde çalışmak için böyle bir kod ihtiyacı, Java'nın bir yangında ölmesini istememin nedenlerinden biridir.

+0

Teşekkür ederim! Şimdi daha güvende hissediyorum! – UGO

+0

@UGO bu sorunu nasıl çözebilir? –

+4

Hala sabit değil - Bu sorunu Java 8'de görüyorum. –

İlgili konular