我怎样才能将一个8位颜色值分成两个4位颜色值?

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

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

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

http://img.zgserver.com/c/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%抖动)

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

我知道,控制台是一个可怕的select,但我不得不尝试做这个没有窗口gdi的帮助。

我完全难以理解这个algorithm,即使看到我的逻辑是否有道理,也很麻烦。

任何人都可以对此有所了解? 所有的帮助表示赞赏,我打了一堵墙。

虽然这可能不是从RGB到彩色ASCII表示的直接答案,但8088 Corruption程序可能是获取从位图图像到CGA屏幕的方法的一个很好的参考。

8088腐败计划旨在运行原始IBM PC(Google视频链接)上带有声音的全动画视频 。

在解释视频编解码器是如何设计的(演示文稿在archive.org上提供的)中,创建者尝试了几种技术,其中之一是使用“ASCII抖动字符”,但不满意最终的质量“图片”。

于是他继续尝试一种将多个像素映射成ASCII字符的方法。 例如,如果有两行垂直重叠,则会在屏幕上绘制ASCII字符X

我没有真正看过源代码(我相信是用x86汇编编写的),但是从我读过的技术描述来看,这可能是值得一看的。

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

由于确切的公式很难计算,我可能会坚持一个巨大的预先计算查找表。 表格必须是三维的(R,G,B的一个维度)和每个维度的[0..255]。 表格的每个单元格应包含三个信息(以2个字节打包):代表字符,前景色,背景色。

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

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

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

有可能以相反的方式工作 – 计算256x16x16表格与RGB结果混合,然后搜索它找到最适合输入RGB的混合。

我建议阅读ImageMagick(Apache 2.0 许可证 ) 量化 (Color Reduction)文档作为起点。 那么你可以看看色彩量化 ,其中我认为最流行的两种方法是使用中值切割法,或使用八分法 。

你也可能更喜欢在非RGB 色彩空间工作 ,比如Lab色彩空间,因为它具有一些很好的属性,欧几里得距离与感知差异(Src: Wikipedia )更加一致。

有几种抖动 ,有序图案抖动,随机抖动和纠错抖动,在这种情况下,我相信你想要纠错来减少表观颜色误差。

4位样片具有RGB值,当您将其中两个与抖动字符混合时,RGB值将是每个单独RGB元素的加权平均值。 重量将取决于所使用的抖动模式,所以对于棋盘图案,每个RGB值将具有相等的重量,所以红色+绿色变成:

[255,0,0] + [0,128,0] = [(255 + 0)/ 2,(0 + 128)/ 2,(0 + 0)/ 2] = [127,64,0]棕色)

其他模式的权重将由前景像素与背景像素的比例决定。

使用它来高效地找到最接近的颜色可能是最困难的部分! 有三个字符,16种颜色和两个前景/背景选项,有大量的组合,但我想可能有大的空白在色域。 如果您只需要从256色调色板转换为其中一种组合,而不是全RGB,那么一个简单的解决方案就是编写一个程序,以便为每个程序尽可能详尽地搜索前景,背景和抖动的最佳组合的256色,并生成一个查找表,然后可以在最终的应用程序中使用,以产生一个直接的查询。

当然这个固定的查表方法只会起作用,256色调色板也是固定的(这不一定是这种情况)。 如果不是,那么你可能需要确定一个找到最佳匹配颜色的更有效的方法。 我敢肯定,它可能比纯粹的搜索更聪明。