2011-12-20 2 views
1

У меня есть BufferedImage с альфа-прозрачностью, которую мне нужно сохранить как GIF с прозрачностью индекса. Отсутствуют пиксели полугруппы, поэтому преобразование должно быть возможным.Сохраните GIF с прозрачностью индекса, используя ImageIO из изображения с альфа-прозрачностью

Используя код, указанный под http://gman.eichberger.de/2007/07/transparent-gifs-in-java.html, я определяю цвет прозрачности (зеленый, например, который не является частью текущего изображения) и делает его прозрачным. Отлично работает, НО он смешивает таблицу цветов, и все цвета выглядят ужасно (хотя я использую только 3 разных цвета).

Есть ли способ отрегулировать это или еще один способ преобразования такого ARGB-изображения в индексированный без существенной потери качества?

Путь мой образ получает построены:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
Graphics2D graphics = (Graphics2D)image.getGraphics(); 
graphics.setColor(backgroundColor); 
graphics.fillRect(0, 0, width, height); 
// Some more painting here 
graphics.dispose(); 

Спасибо за любую помощь!

+0

Преобразование цвета из (A) RGB в индексированные не является тривиальной, если вы знаете, ваш только собираетесь использовать 3 цвета вы должен создать изображение как проиндексированное в первую очередь. Если вам нужно преобразование, вы должны посмотреть на библиотеку изображений (или реализовать алгоритм, например, распространение ошибок самостоятельно, но это не будет очень умным). – Viruzzo

+0

Спасибо за ваш ответ! Ну, дело в том, что мне также нужно сохранить PNG (с альфа-прозрачностью) из одной и той же графики, и я не хочу делать ее дважды (слишком дорого). – Remo

ответ

0

Использование ImageIO для обработки прозрачности, особенно при сохранении в качестве изображения GIF, является кошмаром. Поддержка прозрачности в ImageIO является неполной для разных форматов изображений и даже того же формата изображения, но с разными вариантами.

Если у вас уже есть двоичный прозрачный BufferedImage, у меня есть инструмент квантования цвета и GIF encoder, чтобы сохранить его как GIF с прозрачностью. Если фактические цвета изображения меньше 256, квантование не будет применено. В противном случае цвета будут уменьшены до менее 256, но прозрачный цвет будет сохранен. Сглаживание может применяться во время процесса квантования, поэтому полученный размер изображения может быть больше обычного.

На следующем скриншоте показаны два изображения: слева - исходное изображение PNG с прозрачностью альфа-канала, а справа - прозрачное изображение GIF, преобразованное из одного и того же изображения PNG. Изображение GIF фактически уменьшено до 128 цветов, но качество отличное. (PNG: 49K, GIF: 17K)

enter image description here

Источник изображения: http://svg2rlg.googlecode.com/svn-history/r2/trunk/test-suite/png/butterfly.png

+0

Напоминание: PNG имеет режимы цветовой палитры, и квантование его, как и в GIF, имеет большое значение. Рассмотрим [эту версию] (http://i.stack.imgur.com/85H8e.png) того PNG, который выглядит одинаково, но также весит 17k, с добавленным бонусом, что границы не выглядят как дряблый беспорядок (в отличие от вашего примера gif при просмотре без изменения размера). Я квантовал цвета RGB, но альфа-канал по-прежнему заполнен - ​​не только один уровень прозрачности, как gif. –

+0

(также, только для полноты - исходный SVG меньше, чем GIF и PNG после прохождения через [оптимизатор] (https://github.com/svg/svgo)). –

Смежные вопросы