Domanda

prima di tutto vorrei spiegare la situazione e requisiti che conducono alla domanda:

Nella nostra applicazione web non siamo in grado di supportare immagini CMYK (JPEG) dal momento che IE 8 e sotto non li visualizza.Quindi abbiamo bisogno di rilevare quando qualcuno vuole caricare un'immagine e la nega.

Purtroppo, Java ImageIO non leggere quelle immagini, non mi permettono di ottenere il colore rilevate spazio.Dal debug sembra JPEGImageReader internamente si ottiene lo spazio colore codice 11 (il che significherebbe JCS_YCCK) ma non posso accedere in modo sicuro le informazioni.

Quando si interroga il lettore per i tipi di immagini ricevo nulla per CMYK, quindi potrei assumere no image types = unsupported image.

Ho convertito il fonte immagine CMYK a RGB utilizzando uno strumento di imaging per verificare se si sarebbe poi essere leggibile (ho provato a simulare l'admin della procedura quando si ottiene il messaggio "No CMYK supportato").Tuttavia, JPEGImageReader non leggere l'immagine, dal momento che si presuppone (commento a fonte!)3 componenti RGB spazio colore, ma l'immagine di intestazione report 4 componenti (forse RGBA o ARGB) e quindi un IllegalArgumentException viene generata.

Così, ImageIO non è un'opzione, poiché non posso affidabile ottenere lo spazio colore di un'immagine e non posso dire all'amministratore perché altrimenti è una bella immagine (che può essere visualizzato dal browser) non sarebbe accettata, a causa di un errore interno.

Questo mi ha portato a cercare JAI ImageIO cui CLibJPEGImageReader fa un ottimo lavoro e legge correttamente tutte le mie immagini di prova.

Tuttavia, poiché siamo di distribuire la nostra applicazione in una JBoss che potrebbe ospitare altre applicazioni, vorremmo tenerli il più isolato possibile.Per quanto ne so, avrei bisogno di installare JAI ImageIO per il JRE o altrimenti rendere il nativo di librerie disponibili per il loro utilizzo, e così altre applicazioni potrebbero ottenere l'accesso a loro, che potrebbero causare effetti collaterali (almeno ci sarebbe la prova di un sacco di garantire che non è questo il caso).

Ecco la spiegazione per la domanda, e qui si tratta di nuovo:C'è pure Java alternativa a JAI ImageIO che rileva in modo affidabile e possibilmente converte le immagini CMYK?

Grazie in anticipo,

Thomas

È stato utile?

Soluzione

Ho trovato una soluzione che è ok per le nostre esigenze: Apache Commons Sanselan.Questa libreria si legge JPEG intestazioni abbastanza veloce e preciso (almeno tutti i miei test di immagini), nonché una serie di altri formati di immagine.

Il rovescio della medaglia è che non leggi di immagine JPEG dati, ma posso farlo con la base JRE strumenti.

Lettura di immagini JPEG per la conversione è abbastanza facile (quelli che ImageIO si rifiuta di leggere, troppo):

JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream( new File(pFilename) ) );
BufferedImage sourceImg = decoder.decodeAsBufferedImage();

Quindi se Sanselan mi dice che l'immagine è in realtà CMYK, ho la fonte dell'immagine raster e la conversione di me:

for( /*each pixel in the raster, which is represented as int[4]*/ )
{  
   double k = pixel[3] / 255.0;

   double r = (255.0 - pixel[0])*k;
   double g = (255.0 - pixel[1])*k;
   double b = (255.0 - pixel[2])*k;
}

Questo dare buoni risultati nelle immagini RGB non essere troppo luminoso o troppo scuro.Tuttavia, non so perché, moltiplicando con k impedisce l'illuminazione.Il JPEG è in realtà decodificato in codice nativo e CMYK->conversione RGB ho ottenuto stati qualcosa di diverso, ho appena provato la moltiplicare per vedere il risultato visivo.

Se qualcuno può far luce su questo, sarei grato.

Altri suggerimenti

Ho postato un puro Java soluzione per la lettura di tutti i tipi di immagini JPEG e alla conversione in RGB.

Si basa sui seguenti fatti:

  • Mentre ImageIO non può leggere le immagini JPEG con CMYK tamponata immagine, è possibile leggere i raw i dati dei pixel (raster).
  • Sanselan (o Apache Commons Imaging come si chiama ora) può essere utilizzato per leggere i dettagli di immagini CMYK.
  • Ci sono immagini invertito i valori CMYK (un vecchio Photoshop bug).
  • Ci sono le immagini con YCCK invece di CMYK (può essere convertito facilmente).

Nella nostra applicazione web non siamo in grado di supportare immagini CMYK (JPEG) dal IE 8 e sotto non li visualizza.Quindi abbiamo bisogno di rilevare quando qualcuno vuole caricare un'immagine e la nega.

Io non sono d'accordo con il tuo "Così abbiamo bisogno di rilevare quando qualcuno vuole caricare un'immagine e di negarlo".Molto più user-friendly politica sarebbe quello di convertirlo in qualcosa di diverso rispetto a CMYK.

Il resto del tuo post è un po ' di confusione in quello che riguarda visto che si chiedono, sia per il rilevamento e di conversione, che sono due cose diverse.Ancora una volta, penso di convertire l'immagine è molto più user-friendly.

Non c'è bisogno di scrivere in grassetto btw:

C'è pure Java alternativa a JAI ImageIO che affidabile rileva ed eventualmente converte le immagini CMYK?

Puro Java non so, ma ImageMagick funziona bene per la conversione delle immagini CMYK a RGB quelli.Chiamata ImageMagick sul lato server da Java non è davvero complicato.Ho usato per farlo manualmente chiamando un processo esterno, ma al giorno d'oggi ci sono dei wrapper come JMagick e im4java.

Guardatevi un altro post come il Java 7 non permette di utilizzare direttamente l'implementazione Sun senza particolari parametri come indicato in importazione com.sun.image.codec.jpeg.*.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top