Java 使用有限的调色板渲染针对设备的2D图像
我需要(在我的电脑上)渲染位图图像,以便在具有极其有限调色板的设备上显示(例如,16种颜色,包括红色(0xFF0000)、深红色(0x880000)、灰色等)。我只需要渲染二维几何对象-文本、点、线、多边形和圆弧。我想使用抗锯齿(尽管由于调色板有限,这本身可能非常有限)。我想在屏幕上显示它,然后将其保存为PNG,以便传输到目标设备 假设我从一个从BuffereImage获得的GraphicsD obj开始,基本的方法是什么?我知道如何在AWT框架上显示图像,以及如何使用ImageIO保存图像,但在使用特定调色板渲染形状时,我不太清楚 脑海中浮现的选项有:Java 使用有限的调色板渲染针对设备的2D图像,java,graphics,graphics2d,Java,Graphics,Graphics2d,我需要(在我的电脑上)渲染位图图像,以便在具有极其有限调色板的设备上显示(例如,16种颜色,包括红色(0xFF0000)、深红色(0x880000)、灰色等)。我只需要渲染二维几何对象-文本、点、线、多边形和圆弧。我想使用抗锯齿(尽管由于调色板有限,这本身可能非常有限)。我想在屏幕上显示它,然后将其保存为PNG,以便传输到目标设备 假设我从一个从BuffereImage获得的GraphicsD obj开始,基本的方法是什么?我知道如何在AWT框架上显示图像,以及如何使用ImageIO保存图像,但
想法?解决方案似乎很简单。首先创建一个IndexColorModel,其中包含目标设备上可用的颜色。然后创建一个BuffereImage,指定类型\字节\索引,并提供IndexColorModel。然后启用抗锯齿:
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED, indexColorModel);
Graphics2D gfx2d = image.createGraphics();
gfx2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
gfx2d.setColor(Color.WHITE);
gfx2d.drawLine(10, 10, 100, 160);
Graphics2D渲染原语将仅使用IndexColorModel中的颜色(即目标设备颜色)应用抗锯齿。这可能是一个愚蠢的问题,但如果您使用Graphics2D,您是否永远不会选择使用已知调色板之外的颜色进行绘制?或者,您担心的是使用调色板以外颜色的抗锯齿?仅使用16种颜色的抗锯齿效果可能一点也不好。我希望最终的图像已使用基于目标调色板的抗锯齿进行渲染。因此,例如,红色对象的边缘将有一些暗红色像素(假设为黑色背景)。正常渲染,然后将图像转换为目标调色板,例如使用颜色抖动(有限调色板最有可能优化)参见相关