2013-07-19 6 views
7

Я использую (org.imgscalr.Scalr) библиотеки для изменения размера некоторых изображений, но когда после изменения размера фон становится красным. Мой код:imgscalr с фоном красный

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

Вы можете мне помочь?

Спасибо

+0

Вы полностью задали этот вопрос. –

+0

Вероятно, это связано с прозрачным фоном, идущим от 'png' до' jpg'. –

+0

Есть ли что-то, чтобы установить цвет фона? –

ответ

18

Остальная часть кода вы пропущено (ImageIO сохранить), и если PNG вы читаете в имеет прозрачный канал или нет (как @Daft Punk указал) являются важными битами здесь.

Я готов поставить 1 доллар на то, что у вашего PNG есть альфа-канал, а JPG не поддерживает альфа; к сожалению, кодер JPG Java не знает, чтобы игнорировать альфа-канал на BufferedImage, который вы проходите, и он отбросит один из REAL цветных каналов (R/G/B) в пользу выписывания альфа-значений вместо одного из этих цветовых каналов ,

Например, если у вас есть:

ARGB 

Кодер Java JPG выпишет следующие 3 канала думают, что они являются RGB:

[ARG] 

и выбросить синий канал.

К счастью, исправление мертво просто. Просто создайте новый BufferedImage типа TYPE_INT_RGB так:

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

, то вам нужно «вынести» на BufferedImage с альфа-каналом к ​​нему, чтобы лишить альфа-канал:

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

Теперь вы можете сохраните результат imageToSave изображение в формате JPG, и оно будет выглядеть отлично.

TIP: Не забывайте, что если вам не нравится, как выглядит изображение (размытые, artifacted и т.д.) вам нужно передать аргументы непосредственно в кодере Java JPG, чтобы сказать ему, чтобы не сжать так много (read this) - Это редко проблема, но она возникла в прошлом, когда люди говорят: «imgscalr выглядит плохо!» - получается, что BufferedImage действительно приятный и резкий, но кодер Java слишком агрессивно сжимает результат.

Я имел в виду обратиться к этим небольшим раздражающим словам с изображениями Java, добавив некоторые дополнительные помощники IO в библиотеку imgscalr, чтобы вы могли просто загружать файлы и сохранять их, а не беспокоиться об этих подробных подробных деталях.

+0

Вы являетесь экспертом в этой проблеме. Проблема заключалась в том, что я преобразовал изображение из png в jpg, но теперь проблема была решена. Я многому научился с этой ошибкой. Спасибо вам большое! –

+0

Очень приветствую, я рад, что смогу помочь! –

+0

HI @RiyadKalla, я столкнулся с аналогичной проблемой. Я попытался отладить его, проверив альфа-канал на исходном изображении, но он всегда возвращает false. У меня есть одно и то же приложение, развернутое на двух серверах с одинаковыми Java и ОС, и одно приложение всегда создает цветной фон, а другой создает правильно измененное изображение.Когда я перезапускаю tomcat, он исправляет проблему. Мне становится очень трудно понять, почему это происходит. Можете ли вы предоставить какие-либо идеи, если это возможно. Благодарю. –