如何将一个 8 位颜色值拆分为两个 4 位颜色值?

Rob*_*Rob 5 c windows algorithm programming-languages colors

所以我编写了一个程序,它读取位图并使用 windows.h 打印到控制台。

Windows(在控制台中)允许我为每个字符空间设置两种颜色 - 前景色和背景色。

我仅限于这些颜色的 4 位调色板:

http://www.infotart.com/blog/wp-content/uploads/2008/06/windows_4bit_color_swatches.png

我的程序对于 16 种颜色运行良好,但在计算 256 种颜色时遇到了困难。(或者弄清楚是否有可能)

我需要获取索引颜色的 RGB 值(来自 256 种 8 位颜色,例如 224、64、0)并将其显示为 16 种可用颜色中的两种,其中一种颜色是抖动的。

前景字符将是 ASCII 抖动字符之一(我认为是 176、177、178)。

所以我认为每个背景需要有 R、G、B 值 0、128、255 等,前景可以是 0、32、64、96、128、160、192、224 或 255

因此,如果我有数字 RGB = 192,0,0,我可以将背景设置为 RGB = 128,0,0,并将前景设置为 RGB = 255,0,0,ASCII 字符为 176(25% 抖动)

如果我有一个单独的抖动字符可用于红、绿和蓝色,这似乎会非常简单,但遗憾的是我没有。

我知道控制台是一个糟糕的选择,但我必须尝试在没有 Windows GDI 帮助的情况下执行此操作。

我完全被困在试图找出这个算法的过程中,甚至无法看出我的逻辑是否有意义。

有人能解释一下吗?感谢所有帮助,我碰壁了。

mba*_*off 1

一般来说,您必须“发明”从任何 RGB 到特定彩色字符子集的映射。

由于精确的公式很难计算,我可能会坚持使用一个巨大的预先计算的查找表。表必须是 3 维的(R、G、B 为一维)并且每个维度都必须为 [0..255]。表格的每个单元格应包含三部分信息(包装在2个字节中):代表字符、前景色、背景色。

应按以下方式预先计算该表:对于要用作输出的每个字符,选择每个前景色和背景色,然后计算使用该颜色显示的该字符的 RGB 混合结果。然后,具有给定 RGB 混合坐标的单元格应使用该字符和颜色的信息进行更新。

当然,会有空单元格,因为对于 256^3 种颜色,我们最多只有 256*16*16 种彩色字符变体,因此我们必须使用某种最接近的填充单元格来更新空颜色。

然后,对于任何输入像素,我们只需查找该表,检索字符和颜色,并将它们放入输出中。

可以以相反的方式工作 - 使用生成的 RGB 混合计算 256x16x16 表,然后搜索它以找到最适合输入 RGB 的混合。