gpt4 book ai didi

java - 如何将缓冲图像中的 IndexColorModel 设置为具有某些颜色和一种透明?

转载 作者:行者123 更新时间:2023-12-01 18:10:38 25 4
gpt4 key购买 nike

我正在尝试绘制一个条形图来显示某物的质量。

我创建了一个像这样的缓冲图像:

 private static BufferedImage createBufferedImage(int width, int height) {
int[] palette = {0x00ff00ff, 0xffff00ff, 0xff0000ff , 0xffff0000};
IndexColorModel colorModel = new IndexColorModel(2, 4,
palette, 0, true, 0, DataBuffer.TYPE_BYTE);
return new BufferedImage(width,height,BufferedImage.TYPE_BYTE_INDEXED, colorModel);
}

colorModel 应具有以下颜色:绿色、黄色、红色和一种透明颜色。条形的颜色取决于质量,如下所示:

 private static Color getBarColor(double quality) {
if (quality >= 0.70) {
return Color.GREEN;
} else if (quality >= 0.40) {
return Color.YELLOW;
} else {
return Color.RED;
}
}

我正在创建图形来绘制条形图并设置颜色:

Graphics2D g = image.createGraphics();
g.setColor(getBarColor(quality));

但是,当我将质量颜色设置为大于 0.7 时,它会绘制蓝色条,而将质量设置为低于 0.7 时,它会绘制红色条。

我认为问题出在我的调色板中,我没有正确设置颜色,当我尝试获得绿色时,它不在那里设置最接近的颜色。我认为 AA 设置透明度时应使用 RRGGBBAA 格式,其中 ff 不透明,00 透明。我理解正确吗?问题出在哪里?

非常感谢您的帮助。

最佳答案

您的问题是您假设 alpha 是您输入调色板的整数的低位部分。事实上,它是 ARGB,而不是 RGBA。

您可以使用一个简单的循环来测试它:

for ( int i = 0; i < 4; i++ ) {
int red = colorModel.getRed(i);
int green = colorModel.getGreen(i);
int blue = colorModel.getBlue(i);
int alpha = colorModel.getAlpha(i);

System.out.printf("For index %d, red=%d, green=%d, blue=%d, alpha=%d%n", i,red,green,blue,alpha);
}

结果将是:

For index 0, red=255, green=0, blue=255, alpha=0For index 1, red=255, green=0, blue=255, alpha=255For index 2, red=0, green=0, blue=255, alpha=255For index 3, red=255, green=0, blue=0, alpha=255

Now, if you want the colors to be green, yellow, red and transparent yellow, you should use:

int[] palette = { 0xff00ff00, 0xffffff00, 0xffff0000, 0x00ffff00 };

但您应该注意,您还告诉它将第一个像素值而不是最后一个像素值设为透明。您的颜色模型创建应该是:

IndexColorModel colorModel = new IndexColorModel(2,         // bits per pixel
4, // size of color component array
palette, // color map
0, // offset in the map
true, // has alpha
3, // the pixel value that should be transparent
DataBuffer.TYPE_BYTE);

当你这样做时,如果再次运行上面的循环,你将得到结果:

For index 0, red=0, green=255, blue=0, alpha=255For index 1, red=255, green=255, blue=0, alpha=255For index 2, red=255, green=0, blue=0, alpha=255For index 3, red=255, green=255, blue=0, alpha=0

In fact, it would be much more straightforward if you don't use alpha in the palette values at all, since you want to indicate transparency only in one particular value. For this, set the hasAlpha parameter to false rather than true:

int[] palette = { 0x00ff00, 0xffff00, 0xff0000, 0xffff00 };
IndexColorModel colorModel = new IndexColorModel(2,
4,
palette,
0,
false,
3,
DataBuffer.TYPE_BYTE);

这将为您提供相同的结果,但更容易阅读和预测结果。

关于java - 如何将缓冲图像中的 IndexColorModel 设置为具有某些颜色和一种透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33302280/

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