Остальная часть кода вы пропущено (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, чтобы вы могли просто загружать файлы и сохранять их, а не беспокоиться об этих подробных подробных деталях.
Вы полностью задали этот вопрос. –
Вероятно, это связано с прозрачным фоном, идущим от 'png' до' jpg'. –
Есть ли что-то, чтобы установить цвет фона? –