Есть ли простой способ уменьшить количество цветов в IndexedColorModel? - PullRequest
1 голос
/ 03 декабря 2009

У меня большое 8-битное изображение PNG. Я использую Java, чтобы разделить изображение на более мелкие изображения размером 32x32. Я использую Java ImageIO для загрузки PNG в BufferedImage, а затем называю его getSubimage(x, y, 32, 32). Затем я использую ImageIO, чтобы записать каждую плитку в формате PNG.

Проблема в том, что результирующее изображение имеет тот же IndexColorModel, что и исходное изображение. Например, одна плитка размером 32x32 имеет всего 8 цветов, но включает цветовую модель со всеми 100 нечетными цветами исходного изображения.

Я бы хотел удалить неиспользуемые цвета из плитки IndexColorModel для плитки 32x32, прежде чем выписать PNG. Нет смысла включать данные о цветах для цветов, не используемых в изображении, и я бы хотел, чтобы изображения были как можно меньше.

Есть ли встроенный механизм для этого или кто-то может указать мне (легкий) способ изменить / уменьшить ColorModel?

Спасибо!

1 Ответ

2 голосов
/ 04 декабря 2009

Взгляните на ColorConvertOp в java.awt.image.

По сути, вы создаете новый IndexColorModel желаемой глубины. Если вы действительно хотите наименьшее, вы можете пройти через Raster и посчитать цвета. В противном случае просто выберите 4 или 5 бит на пиксель. Затем создайте BufferedImage с TYPE_BYTE_BINARY и IndexColorMap. Наконец, используйте метод ColorConvertOp filter(), чтобы скопировать исходные данные в новый BufferedImage.

...