2014-09-30 38 views
5

Sto provando a convertire un'immagine (url sotto) utilizzando due librerie (thumbnailator e imgscalr.Il mio codice funziona sulla maggior parte delle immagini tranne alcune che dopo la conversione hanno un colore rosa/tinta rossastraTonalità rosa/rossastra durante il ridimensionamento delle immagini jpeg utilizzando java thumbnailator o imgscalr

sto cercando di capire la causa e sarebbe favorevole a qualsiasi raccomandazione

Nota -.. immagine tipo di questa immagine è 5 cioè BufferedImage.TYPE_3BYTE_BGR e sto usando Java

enter image description hereenter image description here

Utilizzando Thumbnailator

Thumbnails.of(fromDir.listFiles())     
        .size(thumbnailWidth, thumbnailHeight) 
        .toFiles(Rename.SUFFIX_HYPHEN_THUMBNAIL); 

Utilizzando imgscalr

BufferedImage bufferedImage = ImageIO.read(file); 
    final BufferedImage jpgImage; 

    LOG.debug("image type is =[{}] ", bufferedImage.getType()); 

    BufferedImage scaledImg = Scalr.resize(bufferedImage, Method.ULTRA_QUALITY, thumbnailWidth, thumbnailHeight, Scalr.OP_ANTIALIAS); 


    File thumbnailFile = new File(fromDirPath + "/" + getFileName(file.getName()) +THUMBNAIL_KEYWORD + ".png"); 

    ImageIO.write(scaledImg, getFileExtension(file.getName()), thumbnailFile); 

    bufferedImage.flush(); 
    scaledImg.flush(); 
+0

I il problema è che JPEGImageReader interpreta erroneamente i dati JPEG e presuppone che sia RGB, piuttosto che YCbCr (che è ciò che realmente è). Cosa succede se si tenta di visualizzare o scrivere (come PNG, senza ridimensionamento) 'bufferedImage' dal codice imgscalr sopra? Sembra ancora sbagliato? Oppure si verifica solo dopo aver ridimensionato/archiviato come JPEG? – haraldK

+0

@haraldK - Stessa tonalità. – user749665

+0

Suggerisco di provare [plug-in JPEG per ImageIO] (https://github.com/haraldk/TwelveMonkeys#jpeg). Di solito fa un lavoro migliore rispetto al predefinito 'JPEGImageReader', quando si determina lo spazio colore di output. Una delle librerie citate è già pre-bundled con una versione precedente del mio plugin, assicurati di avere l'ultima versione, in quanto la versione in bundle aveva un bug in merito. – haraldK

risposta

4

Ho questa domanda un sacco (autore di imgscalr) - il problema è quasi sempre che siete leggendo/scrivendo diversi formati di file e il canale ALPHA sta causando l'abbattimento di uno dei canali di colore (R/G/B) dalla ris file ulting.

Ad esempio, se si legge in un file che era ARGB (4 canali) e lo ha scritto come JPG (3 canali) - a meno che non si manipoli i tipi di immagine manualmente e si renda direttamente la vecchia immagine a quella nuova , otterrai un file con i canali "ARG" ... o più specificamente, solo Rosso e Verde - nessun blu.

PNG supporta un canale alfa e JPG non, in modo da essere consapevoli di questo.

Il modo per risolvere questo problema è creare appositamente BufferedImage del tipo corretto (RGB, ARGB, ecc.) E utilizzare la chiamata destImage.getGraphics() per eseguire il rendering di un'immagine all'altra prima di scriverlo su disco e ricodificarlo .

Sun e Oracle non hanno mai fatto le librerie ImageIO abbastanza intelligente per rilevare i canali non supportati durante la scrittura di diversi tipi di file, in modo da questo comportamento accade tutto il tempo :(

Speranza che aiuta!

+0

Grazie Riyad. Ho intenzione di provare questo appena possibile. – user749665

+0

Bene? L'hai provato? – bashan

0

Il seguente pezzo di codice risolto il mio problema:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    Thumbnails.of(new ByteArrayInputStream(imageByteArray)) 
    .outputFormat("jpg") 
    .size(200, 200) 
    .toOutputStream(outputStream); 

    return baos.toByteArray(); 

sto usando Thumbnailator e il codice è stato postato qui: https://github.com/coobird/thumbnailator/issues/23