2013-07-19 11 views
7

Uso le librerie (org.imgscalr.Scalr) per ridimensionare alcune immagini, ma quando si ridimensiona lo sfondo diventa rosso. Il mio codice è:imgscalr con sfondo rosso

BufferedImage imagemPng = ImageIO.read(image); 
BufferedImage imagemJpg = Scalr.resize(imagemPng, Method.QUALITY, 1920, 937); 

puoi aiutarmi?

Grazie

+0

Hai appena fatto questa domanda. –

+0

Probabilmente ha a che fare con lo sfondo trasparente che va da 'png' a' jpg'. –

+0

C'è qualcosa per impostare uno sfondo a colori? –

risposta

18

Il resto del codice si omette (l'ImageIO salvataggio) e se il PNG si sta leggendo in ha un canale trasparente o non (come @Daft Punk segnalato) sono i pezzi importanti qui.

Sono disposto a scommettere $ 1 sul fatto che il PNG abbia un canale alfa e JPG non supporti l'alfa; sfortunatamente il codificatore JPG di Java non sa ignorare il canale Alpha su una BufferedImage che si passa e scarterà uno dei canali di colore REAL (R/G/B) in favore della scrittura dei valori alfa invece di uno di quei canali di colore .

Ad esempio, se si dispone di:

ARGB 

L'encoder Java JPG scriverà le seguenti 3 canali pensando che sono RGB:

[ARG] 

ed eliminare il canale blu.

Fortunatamente, la correzione è semplice. Basta creare un nuovo BufferedImage di tipo TYPE_INT_RGB in questo modo:

BufferedImage imageToSave = new BufferedImage(imagemJpg.getWidth(), imagemJpg.getHeight(), BufferedImage.TYPE_INT_RGB); 

allora avete bisogno di "rendere" la BufferedImage con un canale alfa ad esso, per mettere a nudo il canale alfa:

Graphics g = imageToSave.getGraphics(); 
g.drawImage(imagemJpg, 0, 0, null); 

ora si può salva la risultante immagine imageToSave come JPG e sembrerà a posto.

SUGGERIMENTO: Non dimenticare, se non ti piace il modo in cui l'immagine appare (sfocata, artefatta, ecc.) Devi passare argomenti direttamente al codificatore Java JPG per dirgli di non comprimerlo in modo molto (read this) - Questo è raramente un problema, ma è emerso in passato quando la gente dice "imgscalr sembra cattivo!" - Risulta che BufferedImage è davvero bello e nitido, ma il codificatore Java sta comprimendo il risultato in modo troppo aggressivo.

Ho cercato di risolvere questi fastidiosi problemi con le immagini Java aggiungendo altri helper aggiuntivi alla libreria imgscalr in modo da poter caricare i file e salvarli senza preoccuparsi di questi dettagli nitidi.

+0

Sei esperto in questo problema. Il problema è stato quando ho convertito l'immagine da png a jpg, ma ora il problema è stato risolto. Ho imparato molto con questo errore. Grazie mille !!! –

+0

Benvenuto, sono contento di poterti aiutare! –

+0

HI @RiyadKalla, sto affrontando un problema simile. Ho provato a debuggarlo controllando il canale alfa sull'immagine originale, ma restituisce sempre false. Ho la stessa applicazione distribuita su due server con Java e OS uguali e un'applicazione produce sempre lo sfondo colorato e l'altra produce l'immagine corretta ridimensionata.Quando riavvio Tomcat risolve il problema. Sta diventando davvero difficile per me capire perché sta succedendo questo. Potete fornire eventuali approfondimenti, se possibile. Grazie. –