如何将缓冲图像中的 IndexColorModel 设置为具有某些颜色和一种透明?
How to set IndexColorModel in Buffered image to have certain colors and one transparent?
我正在尝试绘制一个条形图来显示某物的质量。
我创建了一个这样的缓冲图像:
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 时,id 会绘制红色。
我认为问题出在我的调色板中,我没有正确设置颜色,当我尝试获得绿色时却没有设置最接近的颜色。我认为格式 RRGGBBAA 应该用于 AA 设置透明度且 ff 不透明且 00 为 transparent.Do 我理解正确吗?问题出在哪里?
感谢您的帮助。
您的问题是您假设 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=0
For index 1, red=255, green=0, blue=255, alpha=255
For index 2, red=0, green=0, blue=255, alpha=255
For index 3, red=255, green=0, blue=0, alpha=255
现在,如果你想要颜色是绿色、黄色、红色和透明黄色,你应该使用:
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=255
For index 1, red=255, green=255, blue=0, alpha=255
For index 2, red=255, green=0, blue=0, alpha=255
For index 3, red=255, green=255, blue=0, alpha=0
事实上,如果您根本不在调色板值中使用 alpha 会更直接,因为您只想在一个特定值中指示透明度。为此,将 hasAlpha
参数设置为 false
而不是 true
:
int[] palette = { 0x00ff00, 0xffff00, 0xff0000, 0xffff00 };
IndexColorModel colorModel = new IndexColorModel(2,
4,
palette,
0,
false,
3,
DataBuffer.TYPE_BYTE);
这将为您提供相同的结果,但阅读和预测结果要容易得多。
我正在尝试绘制一个条形图来显示某物的质量。
我创建了一个这样的缓冲图像:
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 时,id 会绘制红色。
我认为问题出在我的调色板中,我没有正确设置颜色,当我尝试获得绿色时却没有设置最接近的颜色。我认为格式 RRGGBBAA 应该用于 AA 设置透明度且 ff 不透明且 00 为 transparent.Do 我理解正确吗?问题出在哪里?
感谢您的帮助。
您的问题是您假设 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=0 For index 1, red=255, green=0, blue=255, alpha=255 For index 2, red=0, green=0, blue=255, alpha=255 For index 3, red=255, green=0, blue=0, alpha=255
现在,如果你想要颜色是绿色、黄色、红色和透明黄色,你应该使用:
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=255 For index 1, red=255, green=255, blue=0, alpha=255 For index 2, red=255, green=0, blue=0, alpha=255 For index 3, red=255, green=255, blue=0, alpha=0
事实上,如果您根本不在调色板值中使用 alpha 会更直接,因为您只想在一个特定值中指示透明度。为此,将 hasAlpha
参数设置为 false
而不是 true
:
int[] palette = { 0x00ff00, 0xffff00, 0xff0000, 0xffff00 };
IndexColorModel colorModel = new IndexColorModel(2,
4,
palette,
0,
false,
3,
DataBuffer.TYPE_BYTE);
这将为您提供相同的结果,但阅读和预测结果要容易得多。