colors - 计算机如何以不同的方式处理 ascii/文本和图像/颜色?

标签 colors binary ascii

我最近一直在思考计算机硬件必须做什么样的工作才能产生我们期望的东西。

比较文本和颜色,似乎两者都依赖于 1 和 0 的组合,每个字节有 256 种可能的组合。 ASCII 可以将诸如 (01100001) 之类的字母表示为字母“A”。但是可能会有代表某种随机颜色的颜色 R(01100001)、G(01100001)、B(01100001)。从低层次考虑,计算机只是读取这些 1 和 0 的集合,需要做什么来确保计算机呈现颜色 R(01100001)、G(01100001)、B(01100001) 而不是字母 A 三次在我的屏幕上?

最佳答案

我不完全确定这个问题是否适合 Stack Overflow,但无论如何我会继续给出一个基本的答案。虽然这实际上是一个非常复杂的问题,因为根据你想回答它的深度,我可以写一整本书关于计算机体系结构来做到这一点。

所以为了简单起见,我会给你这个:这完全是一个上下文问题。首先让我们处理文本:

例如,当您打开一个文本编辑器时,隐含的假设是要在其中显示的数据本质上是文本的。要显示的文本是内存中的一些字节(可能从磁盘上的一些字节中复制出来)。从内存的角度来看,这些字节是文本没有神奇的内部上下文。相反,文本编辑器的源代码包含一些指向这些字节的命令,例如“这些字节代表 300 个文本字符”。然后有一个复杂的步骤序列,涉及库代码一直到硬件处理根据 ASCII 等编码(还有许多其他编码文本的方法)将这些字节映射到字符,在字体中找到这些字符,将该字体写入屏幕等。

关键是它不必将这些字节解释为文本。它只是因为这就是文本编辑器所做的。您可以假设在图像程序中打开它,并告诉它将这些相同的 300 字节解释为 10x10 RGB 值数组(或图像)。

至于颜色,同样的逻辑适用。它们只是内存中的字节。但是当在屏幕上绘制一些东西的代码决定了它想用什么颜色写入哪些像素时,它将通过内存映射将这些字节通过管道传输到视频卡,然后将它们转换为发送到显示器的命令(仍然以某种二进制格式表示像素和颜色,尽管实际情况要复杂得多),并且显示器本身包含固件,然后处理将这些颜色映射到物理像素的细节。代表颜色本身的数字将在某个时候转换为每个 R/G/B channel 的特定电流,以提高或降低其强度。

这就是我现在所有的时间,但这是一个开始。

更新:为了说明我的观点,我从 here 中取出了 Flatland 的文本。 .这只是 216624 字节的 ASCII 文本(由您的 Web 浏览器根据上下文进行解释:.txt 扩展名有帮助,​​但 Web 服务器还提供一个 MIME 类型 header ,通知浏览器应将其解释为纯文本。您的浏览器也可能会分析字节以确定它们的模式确实看起来像纯文本的模式(并且没有大量不代表 ASCII 字符的字节)。我在文本末尾附加了一些空格,因此它的长度为 217083,即 269 * 269 * 3,然后将其绘制为 269 x 269 RGB 图像:



看起来不是很有趣。但关键是我只是取了那些完全相同的字节并告诉软件,“好吧,现在这些是 RGB 值”。这并不是说将纯文本字节视为图像没有用处。例如,它可能是一种可视化加密算法的有用方法。 This显示了一个使用非常不安全的算法加密的图像——您仍然可以很好地了解原始未加密文件中的字节模式。如果它是文本而不是图像,这也没有什么不同,因为英语等特定语言的文本也具有已知的统计模式。一个好的加密算法会使加密图像看起来更像随机噪声。

关于colors - 计算机如何以不同的方式处理 ascii/文本和图像/颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15011434/

相关文章:

eclipse - Eclipse内容帮助中的所选条目由于颜色而无法读取

css - 混合两个相互堆叠的元素的透明色背景

c - 从 C 中的二进制文件读取字符串时发生访问冲突

c - 是否有将整数转换为十六进制或二进制的 C 库?

colors - Sublime 改变highlight_modified_tabs的颜色?

python - 黑白图像到二进制数组

PHP:字符串不等于字符串

c++ - 为什么在 if 语句中对字母表中的字母使用 ASCII 码,而不是使用普通的 char 数据类型?

java - 从 Arrays.toString(); 中删除一个值?

jquery - 为负数/正数着色 (jQuery)