2010-12-17 5 views
8

ImageIO.read (imagePath) con questo file dà un CMMException, perché non posso Java far fronte a questo file apparentemente valida http://www.jthink.net/jaikoz/scratch/front.jpgPerché caricare questo jpg utilizzando JavaIO fornisce CMMException?

java.awt.color.CMMException: Invalid image format 
    at sun.awt.color.CMM.checkStatus(Unknown Source) 
    at sun.awt.color.ICC_Transform.<init>(Unknown Source) 
    at java.awt.image.ColorConvertOp.filter(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source) 
    at javax.imageio.ImageIO.read(Unknown Source) 
    at javax.imageio.ImageIO.read(Unknown Source) 
+0

Quale versione di Java stai usando ?? funziona per jdk 1.5 anf 1.6. – Favonius

+0

Eh, Sto usando 1.6.22 su Windows 7 –

+0

Ive ha aggiunto lo stacktrace, forse questo farà un po 'di luce su di esso –

risposta

15

Credo che ho avuto il blocco del vostro problema. Ho controllato l'immagine che hai collegato (http://www.jthink.net/jaikoz/scratch/front.jpg). È dovuto allo standard Exif e JFIF.

quando si sta facendo qualcosa come ImageIO.read('some file') si richiama l'implementazione jpeg di default com.sun.imageio.plugins.jpeg.JPEGImageReader. Che aveva problemi con il caricamento dei file JFIF BUG 6488904 (controllare il commento verso la fine).

Secondo spec, sia Exif e richieste JFIF che il loro rispettivo segmento marcatore applicazione deve essere il primo destra dopo SOI (APP1 e APP0) , quindi in realtà non è possibile per spec per un file JPEG per essere conforme allo con entrambi gli standard.

Anche se è stato segnalato molto tempo fa

La soluzione è utilizzare libreria JAI (https://jai.dev.java.net/binary-builds.html#Release_builds). Sto usando la versione Java (senza accelerazione nativa).

SeekableStream seekableStream = new FileSeekableStream(new File("front.jpg")); 
ParameterBlock pb = new ParameterBlock(); 
pb.add(seekableStream); 

BufferedImage image = JAI.create("jpeg", pb).getAsBufferedImage(); 

sperare che questo possa essere d'aiuto.

+0

thx, guarda bene ci guarderò dentro –

+0

@ user294896: siete i benvenuti. Se la risposta ha risolto il problema, contrassegnarlo come accettato. in questo modo sarà fuori dalla lista senza risposta. Grazie. – Favonius

+0

sì funziona, mi chiedo solo che c'è un modo per farlo usando l'API pubblica piuttosto che le sottostanti classi Sun (come SeekableStream) –

2

Vecchio post, ma per riferimento futuro:

Ispirato da questa domanda e collegamenti trovato qui, ho scritto un plugin per JPEGImageReader ImageIO che supporta immagini JPEG con questo tipo di profili di colore ICC "cattivi" (il "problema" è l'intento di rendering nel profilo ICC è incompatibile con ColorConvertOp di Java). È semplice Java e non richiede JAI. Il codice sorgente è liberamente disponibile presso:

https://github.com/haraldk/TwelveMonkeys/tree/master/imageio/imageio-jpeg

+0

Puoi fornire una piccola spiegazione e un esempio nel tuo README su GitHub su come integrare e usare il tuo collegare? Sarebbe grandioso. – Jack

+0

@Jack Lo farò. Inoltre, sentiti libero di presentare problemi con i documenti mancanti su GitHub, se c'è qualcosa che in particolare ti piace documentato. Ma tutto ciò che devi fare è costruire il progetto usando Maven e posizionare JAR nel percorso della classe. Lo userai proprio come faresti con il plug-in JPEG standard (ad es .: 'ImageIO.read (...)' o 'ImageIO.getImageReaders (...)'). – haraldK