gpt4 book ai didi

java - 设置 RGB 值以减少 PNG 图像中的调色板

转载 作者:行者123 更新时间:2023-12-04 06:18:39 27 4
gpt4 key购买 nike

我有 following method ,这会减小 PNG 图像中的调色板大小。

private BufferedImage setColour(BufferedImage image) {
IndexColorModel cm = new IndexColorModel(
3,
6,
new byte[]{-100, 0, 0, 0, -1, 0}, // r
new byte[]{0, -100, 60, 0, -1, 0}, // g
new byte[]{0, 0, 0, -100, -1, 0}); // b
BufferedImage img = new BufferedImage(
image.getWidth(), image.getHeight(),
BufferedImage.TYPE_BYTE_INDEXED,
cm);
Graphics2D g2 = img.createGraphics();
g2.drawImage(image, 0, 0, null);
g2.dispose();
return img;
}

我知道每个字节数组都用于索引与 PNG 像素关联的调色板。我不明白的是如何设置字节数组中的值,以便我只能 减少 PNG 图像中的颜色编号。

最佳答案

索引颜色模型基本上列出了可以在 BufferedImage 中使用的所有颜色及其 RGB 值。

中的每一列

//          red, light green, dark green, blue, white, black
new byte[]{-100, 0, 0, 0, -1, 0}, // red part
new byte[]{ 0, -100, 60, 0, -1, 0}, // green part
new byte[]{ 0, 0, 0, -100, -1, 0} // blue part

对应一种颜色 - 我在评论行中添加了它们。

只有这些颜色最终会用于生成的图像,其他所有颜色都将使用最接近的颜色或两种最接近颜色的图案来近似:

(in - out)
(图片盗自 Rekin's answer。)

如果您不仅要减少到 6 种颜色,而且要减少到更多的颜色,您只需列出更多颜色即可。您可以在此处使用预定义列表,也可以根据原始图像的统计数据调整它们(例如,如果图像主要由蓝天组成,则在此处包括几种蓝色色调,但不包括其他颜色)。或者在几个预定义的调色板之间进行选择,寻找与原始图像差异最小的调色板。

除了使用 IndexedColorModel,您还可以使用其他 ColorModel 实现之一。例如,这将是一个具有 4 个透明度级别的 64 色空间,平均分布(我认为),每个像素使用一个字节(每个颜色两个位):
new DirectColorModel(8, 0xC0, 0x30, 0x0C, 0x03);

这个只使用一位表示透明度,而不是使用三位表示绿色(人眼可以更清楚地看到):
new DirectColorModel(8, 0xC0, 0x38, 0x06, 0x01);

我没有将它们与 PNG 编码器一起测试,请这样做。

关于java - 设置 RGB 值以减少 PNG 图像中的调色板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6885360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com