渲染针对具有有限调色板的设备的2D图像

时间:2016-09-20 21:32:26

标签: java graphics graphics2d

我需要渲染一个位图图像(在我的PC上),用于显示在具有极其有限的调色板的设备上(例如,由RED(0xFF0000),DARK_RED(0x880000),灰色等组成的16种颜色)。我只需要渲染2D几何对象 - 文本,点,线,多边形和弧。我想使用抗锯齿(虽然由于有限的调色板,这本身可能非常有限)。我希望在将其保存为PNG之前将其显示在屏幕上,然后将其传输到目标设备。

基本方法是什么,假设我开始使用从BufferedImage获得的GraphicsD obj?我知道如何在AWT Frame上显示图像以及如何使用ImageIO保存图像,但是在使用特定调色板渲染形状时不太清楚。

想到的选项是:

  1. 使用Graphics2D API以完全24位颜色渲染,并启用抗锯齿功能。后处理将每种颜色映射到目标调色板中它最近的邻居。

  2. 说服Graphics2D使用目标调色板(IndexColorModel?)。通过Graphics2D API渲染。

  3. 编写我自己的基元来渲染线条,形状等。

  4. 选项3我不热衷于此。选项1是可行的,但我不能感觉如果反对目标调色板这样做,抗锯齿效果会更好。这可能只是偏执狂。

    选项2对我来说不清楚,也许不可能。

    想法?

1 个答案:

答案 0 :(得分:1)

解决方案似乎非常简单。首先创建一个IndexColorModel,其中包含目标设备上可用的颜色。然后创建一个BufferedImage,指定TYPE_BYTE_INDEXED,并提供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中的颜色(即目标设备颜色)应用消除锯齿。