计算机只认识0和1但是怎么表示图像和影视等等众多应用的?
原文:计算机只认识0和1但是怎么表示图像和影视等等众多应用的? - 知乎 (zhihu.com)
0 和 1 是两种状态,看上去没法表示诸如图像这样的复杂信息。但是,题主还记不记得以前那个发明国际象棋的数学家给国王出的难题?在第一格放一粒米,第二格放两粒米,以后每一格都要放比前一格多一倍的米,直到把 64 格放满。看起来好像不需要消耗多少米,其实总共需要粒米,即一万亿亿粒米,全国乃至全世界的米都不够用。但这两者之间有什么关系呢?米的数量我们都知道是一个和格子位置相关的指数函数,若为格子位置,设所需米粒数为,则。回到二进制上,一位二进制能表示 0、1 两种状态,两位二进制能表示 00、01、10、11 四种状态,以此类推,位二进制能表示种状态。假设有一个 64 位的二进制序列,那么其能表达的信息就有约种。现在是不是觉得图像这种复杂信息能被计算机所认识,也并不是那么神秘了?且慢。二进制码终究是二进制码,永远是那冷冰冰的 0、1,永远没有色彩。那么,计算机是怎么识别出图像的呢?这涉及到两个专业术语:编码、解码。让我用通俗的语言一一解释给你听。我们小时候牙牙学语,直到现在能看懂、听懂绝大部分的汉语。但是,如果听到一个其他国家的语言,比如德语、法语、日语,有些人能听懂,有些人只能是变哑巴,甚至瞎猜,以至于解读出错误的信息。汉语这个语言体系,将我们肉眼看到的物体、方块字形,以及耳朵听到的波形特征统一进行了规定。“一”这个汉字就是读 yi,你不能读成 er。再比如,家里吃饭的地方就叫客厅,而不能叫厨房或者卧室。这种硬性的规定,在计算机术语里,就叫编码(code)。汉语这个语言,广义上说,它是一种编码,因为它将我们所感知到的原先毫无意义的模拟信号转变成有意义的信息。而计算机里的编码,同样也是将计算机中存储的原先毫无意义的二进制序列组合赋予了含义。举个例子,我们现在创造一种编码,能够存储英文文本信息。大小写字母加在一起 52 个,再加上10 个阿拉伯数字,以及若干标点符号、数学符号,那么,用 7 位二进制存储就够了,因为 7 位二进制能表达种信息。但我们不能一棍子打死,万一以后还要再添加新的文本信息,不够用就麻烦了,我还得重新再制作编码。所以干脆就多加一位,用 8 位存储,使得这种编码具有能表达 256 种信息的能力。然后,我们再将 8 位二进制序列按照以下规定来解释:那么,当计算机读取到了下面这一串本无意义的二进制序列时:01001000 01100101 01101100 01101100 01101111 00100001它根据这套编码规则,就将其解释成了下面这个(对我们地球人而言)有意义的句子:Hello!这套编码就是计算机界大名鼎鼎的 ASCII 码(ASCII Code)。而以上的根据一定的编码规则对二进制序列进行解释的过程叫做解码(decode)。解码的载体叫做解码器(decoder)。我们学会了汉语,也就等同于我们的脑子中存储了汉语的解码器,所以我们能听懂也能表达汉语。而对于日语,当你听到日语中的「ただいま」(读音是 TA DA I MA)这个词的时候,学过日语的就知道这是“我回来了”的意思,而没学过日语的,可能就会理解成照搬汉语音的“他大姨妈”,甚至是不知所以的“卧槽,这什么鬼”,也就是,脑子里没有存储这些语言的解码器,所以自然也就无法解码,得到的要么是(在他们看来)没有意义的模拟音频信号(即“卧槽这什么鬼”),要么是用错误的解码器解出的乱码(即“他大姨妈”)。计算机中的文本阅读器,正是因为带上了 ASCII 码的解码器,才得以成功解码这个二进制序列。ASCII 码只用到了 8 位二进制中的低 7 位,最高位没有用到。等到计算机也普及到了世界各地,为了多语言的需要,原本的 ASCII 码显然不够用了,计算机界在原先 ASCII 码的基础上又发展出了多套文本编码。首先是 ISO8859 码,直接在原先的 ASCII 码上扩展,仍然是 8 位二进制表示一种文本信息,它在原先 ASCII 码的基础上增加了欧洲的一些文字符号。再到后来,计算机普及到了亚洲地区,而亚洲及中东特有的文字系统让 ISO8859 无能为力,最开始是各地方自造编码,比如中国大陆的 GBK 码,台湾的 Big5 码,日本的 Shift-JIS 码等,他们都占用了 ASCII 码的扩展部分,并且和 ASCII 码标准部分兼容。因为 ISO8859 码也用到了 ASCII 码的扩展部分,所以很明显,这几套编码都不与 ISO8859 码兼容,而且彼此也不兼容(仅有共用 ASCII 的部分兼容)。再后来,世界性的交流越来越多,统一文字编码势在必行,这就诞生了 UTF-8 码,世界上所有的文字信息在 UTF-8 中都能找到一席之地。扯远了,话说回来,文字信息的表达方式我们已经知道了,那么对于图片信息呢?图片里有两种基本信息:分辨率、颜色。我们小时候都学过,太阳虽然看上去是金黄色,但实际上它是由七种颜色组成的。但我们看光谱就知道,这里的七种是肉眼可分辨的大体上的七种,实际上可以说是无数种。光学上,颜色通过叠加可以生成其他颜色。那么,有没有那么几种颜色,通过他们任意形式的叠加就能生成所有的颜色呢?实际上是有的。光学中,有个概念叫做三基色,它们是红、绿、蓝。它们的特点是,不可以被其他的颜色组合形成,同时它们三者以任意亮度组合,可以生成肉眼可见的所有颜色。根据光学里的这个特性,计算机中,对于颜色信息,自然也就按照红绿蓝亮度值的方式存储。我们现在将红绿蓝的亮度范围依次等分成 256 份,这样一个 8 位二进制序列就能表示红、绿、蓝三者之一的亮度值,那么每 24 位二进制就能表示一种颜色,这样算下来,一共可以表示种颜色,肉眼足够了。这就是 RGB 模型(RGB Module),R、G、B 分别对应英语中的 Red、Green、Blue,它们统一叫做通道(channel)。如果 R、G、B 这三个通道分别表示一个维度,那么这个模型就是一个立方体,它看起来是这个样子:注:x、y、z 轴上的数表示的是相对满量程的占比,所以其范围都是 0~1,而不是 0~255。那么,从宏观到微观,一副图像,我们可以认为是由一定数量的带有 RGB 颜色信息的点的矩阵构成的。这样的点就叫做像素(pixel)。而这个像素矩阵的大小就叫做图像的分辨率(resolution)。在计算机的世界里,图像就是由某个固定的分辨率的 RGB 像素矩阵组成的。这些 RGB 元素,加上一些图像说明信息(如作者、图像分辨率大小等),就构成了图像的编码。看图软件将图像编码进行解码,得到 RGB 矩阵,然后这些矩阵信息给显示屏,显示屏根据驱动程序给定的屏幕信息(也就是 RGB 矩阵)投射相应亮度的红、绿、蓝的激光到屏幕上的每一个点,这就形成了我们所看到的图像。常见的业界标准图像编码有 JPEG, PNG,以及专用于网页的 GIF 等,它们的编码规则受专利保护,这里不做说明。声音,同样有自己的编码。因为声音本质是波形,波形就有瞬时频率,那么将这些瞬时频率值按照一定的编码规则写成二进制序列,就形成了声音文件。可瞬时是数学中的极限概念,计算机中只能用一个足够小的时间来表示瞬时,比如说,规定一个 1/22050 秒是一个瞬时,那么 1 秒钟就是 22050 个瞬时,也就是 1 秒钟能记录 22050 个瞬时频率。这就是声音的采样率(the audio's sample rate),很明显,这个声音文件的采样率是 22.05kHz。采样率越高,声音就越逼真,但同时占用的存储空间也越大。另外,编码格式方面,常见的声音格式有 AAC、CDA、MP3、WAV、WMA 等。对于视频,它由图像序列以及声音组合而成,并且按照一定的频率进行刷新(比如,一秒刷新 24 副图像)。这是利用了人的视觉暂留效应,让人感觉到画面在动,实际上它仍然是由静态图像拼接而成的。视频的编码,早期大家独立发展,留下了后患,即便到了现代世界,也有 3GP、AVI、FLV、MKV、MP4、RMVB 等超多种编码格式。文本、图像、声音、视频等在计算机中存储的,对人体感官有意义的,有业界编码标准的二进制序列信息统称为多媒体信息(multimedia information)。计算机虽然只认识 0 和 1,但由于各类多媒体信息的解码器的存在,计算机也就读懂了这些 0 和 1 的含义。