所以我写了一个程序,读取位图并使用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色调色板也是固定的(这不一定是这种情况)。 如果不是,那么你可能需要确定一个找到最佳匹配颜色的更有效的方法。 我敢肯定,它可能比纯粹的搜索更聪明。