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

标签 java graphics graphics2d

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

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

我想到的选项是:

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

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

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

我不喜欢选项 3。选项 1 是可行的,但我不禁觉得如果针对目标调色板这样做,抗锯齿效果会更好。这可能只是偏执。

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

想法?

最佳答案

解决方案似乎非常简单。首先创建一个 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 中的颜色(即目标设备颜色)来应用抗锯齿功能。

关于java - 渲染针对调色板有限的设备的 2D 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604073/

相关文章:

Java,缓冲图像的颜色与原始图像完全不同

java - 从Java中的另一个方法调用paint()

windows - 加速 Windows 上的文本输出,用于控制台

java - 尝试创建进度条

java - 旋转 BufferedImage 实例

java - Android NDK 中止停止,无法创建 NDK 版本

java - 2D 游戏中可自定义的玩家头像

java - Socket.io 无需加入即可收听房间

java - Glide 库加载 GIF 很慢

java - java中用图像填充黑色?