prima mi piacerebbe spiegare la situazione/requisiti che conducono alla domanda:alternativa puro Java per JAI ImageIO per il rilevamento di immagini CMYK
Nella nostra applicazione web, non siamo in grado di supportare le immagini CMYK (JPEG) dal IE 8 e sotto non possono visualizzarli. Quindi dobbiamo rilevare quando qualcuno vuole caricare tale immagine e negarla.
Sfortunatamente, ImageIO di Java non leggerà quelle immagini o non mi consentirebbe di ottenere lo spazio colore rilevato. Dal debug sembra che lo JPEGImageReader
internamente riceva il codice dello spazio colore 11 (che significherebbe JCS_YCCK
) ma non posso accedere in modo sicuro a tali informazioni.
Quando si interrogano il lettore per i tipi di immagine, non ottengo nulla per CMYK, quindi potrei assumere no image types = unsupported image
.
Ho convertito l'immagine CMYK di origine in RGB utilizzando uno strumento di imaging per verificare se sarebbe quindi leggibile (ho provato a simulare i passi dell'amministratore quando ho ricevuto il messaggio "No CMYK supportato"). Tuttavia, JPEGImageReader
non leggerà quell'immagine, dal momento che assume (commento nella fonte!) Spazio colore RGB a 3 componenti, ma l'intestazione dell'immagine riporta 4 componenti (forse RGBA o ARGB) e quindi viene lanciato uno IllegalArgumentException
.
Quindi, ImageIO non è un'opzione in quanto non posso ottenere in modo affidabile lo spazio colore di un'immagine e non posso dire all'amministratore perché un'immagine altrimenti bella (può essere visualizzata dal browser) non sarebbe accettata a causa di un errore interno.
Questo mi ha portato a provare JAI ImageIO cui CLibJPEGImageReader
fa un ottimo lavoro e corretto legge tutte le mie immagini di prova.
Tuttavia, poiché stiamo implementando la nostra applicazione in un JBoss che potrebbe ospitare anche altre applicazioni, vorremmo tenerle il più isolate possibile. AFAIK, avrei bisogno di installare JIO ImageIO su JRE o altrimenti rendere disponibili le librerie native per poterle usare, e quindi anche altre applicazioni potrebbero accedervi, il che potrebbe causare effetti collaterali (almeno avremmo testare molto per assicurarsi che non sia così).
Questa è la spiegazione per la domanda, e qui si tratta di nuovo: C'è un puro Java alternativa al JAI ImageIO che rileva in modo affidabile e possibilmente converte le immagini CMYK?
Grazie in anticipo,
Thomas
Ho riscontrato lo stesso problema con le immagini JAI e CMYK JPEG. Utilizzi questo approccio già in produzione? Com'è la tua esperienza? Suppongo che tu usi 'Sanselan.getImageInfo (...). GetColorType() == ImageInfo.COLOR_TYPE_CMYK' ([ImageInfo] (http://commons.apache.org/sanselan/api-release/org/apache/sanselan /ImageInfo.html)) per verificare se si tratta di un'immagine CMYK, giusto? –
@bene Sì, stiamo prima controllando se Sanselan ha trovato un profilo ICC e, in tal caso, prende il suo tipo di spazio colore, ma se fallisce usiamo 'ImageInfo.getColorType()'. Lo stiamo utilizzando in produzione e non abbiamo avuto problemi finora, tuttavia, devo ammettere che al momento non stiamo gestendo molte immagini. In futuro avremo il nostro database multimediale che gestirà migliaia di immagini e quindi avremmo informazioni più affidabili sulla prontezza della produzione di tale approccio. Solo una nota a margine: la conversione di Tiffs CMYK produce alcune tinte evidenti e non siamo riusciti a sbarazzarcene. – Thomas
Oggi ho colpito un'immagine in cui ICCProfile di Sanselan ha ColorSpaceType CMYK mentre ColorType di ImageInfo è RGB. Lo spazio cromatico è in realtà RGB. Mi chiedo se hai avuto lo stesso problema. –