【问题标题】:Convert 8-bit Indexed color to RGB将 8 位索引颜色转换为 RGB
【发布时间】:2013-08-07 18:32:20
【问题描述】:

我找不到将 8 位索引颜色转换为 RGB 的转换例程。对于一些背景细节,我正在使用 POI 读取 xlsx 文件,其中一个单元格的背景颜色索引为值 64。当我尝试在 iText 中使用此值作为背景 BaseColor 创建 PdfPCell 时,我得到了海军蓝正确的颜色应该是黑色。所以我需要一个将 64 的值转换为 rgb(0, 0, 0) 的例程。

这是将背景设置为海军蓝的代码

short c = ((XSSFColor) color).getIndexed();
BaseColor base = new BaseColor(c);

我在 SO 上发现了一个类似的问题,但是“打包”例程因“颜色值超出 0-255 范围”而失败。

short packed = ((XSSFColor) color).getIndexed();
log.debug("Indexed {}", packed);
int r = (packed >> 5) * 32;
int g = ((packed >> 2) << 3) * 32;
int b = (packed << 6) * 64;
BaseColor base = new BaseColor(r, g, b);

更新 1: 文档中似乎有一个 Palette,在我的例子中是一个 XSSFPalette。找到答案后,我会在这里更新。

更新 2: XSSFWorkbook 不提供对调色板的访问,因此我的以下问题:Access to the color palette in an XSSFWorkbook

【问题讨论】:

  • 索引颜色?你不需要一个颜色索引表来参考颜色吗?你不能拿到桌子吗?
  • 老实说,我不知道。我去看看 POI 里有没有颜色表。
  • 您的索引颜色可以是任何颜色,不是吗?这种方案的想法不是通过将实际颜色存储在调色板中来减少内存使用吗?还是我错过了什么? 64 可以在一张图像上为黑色,而在下一张图像上为深蓝色 ...?
  • 我也没有哈哈。那将是正确的方法。索引颜色通常是指存储实际颜色的数据结构。

标签: java colors apache-poi itext


【解决方案1】:

颜色索引和 RGB 值之间没有数学关系。这是一个查找。

八位索引颜色表示每个像素的颜色由数字 0-255 表示。这些颜色实际上是什么取决于您的调色板(就像画家会使用的那样!)因此,八位允许您在图片中拥有 256 种不同的颜色。

如果您的图像以彩色显示,那么您在某处有一个调色板,它会告诉您什么索引对应于什么 RGB 三元组。

http://en.wikipedia.org/wiki/Indexed_color

【讨论】:

  • 感谢您的回答,现在问题是找到调色板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 2011-07-10
  • 1970-01-01
  • 2022-11-25
  • 2019-05-23
  • 1970-01-01
  • 2019-02-08
相关资源
最近更新 更多