知乎日报

每日提供高质量新闻资讯

头图

计算机只认识 0 和 1,为什么能表现出图像和视频?

Pixabay / CC0

计算机只认识0和1但是怎么表示图像和影视等等众多应用的?

kross,想成为艺术家的程序员。

首先你要知道 01 这玩意(二进制)如何表示数,假设位数是 4 位的话,

0001->1

0010->2

0011->3

...

左边是二进制,右边是十进制。

好,你能理解这个的话,这样任何数值都可以表示了。具体请搜索「进制转换」。

然后很久以前牛顿通过三棱镜把白色的光分解成七种不同颜色的光(实际上不是离散的吧,应该说分解成无数种颜色的光了哈哈哈)。

后来牛顿同学通过各种实验发现红,绿,蓝三种颜色的光是无法被分解的,因此我们就称为红绿蓝为光的三原色。

OK,人类已经明白可以通过组合不同比例的红,绿,蓝三种颜色来得到各种各样的颜色。那么我们就可以在计算机上模拟了。

第一个要解决的问题是,每个颜色分量有多少个级别呢?假设三个分量只用一位(1 bit)来表示,那么就是 0,1,也就是说,红色只有【有】与【无】两种情况,其他颜色也一样,因此三个颜色组合在一起就是 2 * 2 * 2 = 8 种颜色。

那这样实在是太不实用了。

现在的计算机,一般使用 32 位来表示颜色,32 位平分给四个分量,也就是每个分量 8 位。

(为啥是四个颜色分量?)

其实,现在的颜色模型中有一个 alpha 值,用来表示透明度的,你可能会见到过 ARGB 这样的玩意,A 就是表示 alpha 啦。

alpha 我们先不管它。

那么红色 Red,绿色 Green,蓝色 Blue,每个都有 8 位的空间来表示,能表示的级别就有 2 ^ 8 = 256 种啦。也就是:

0000 0000 -> 0

0000 0001 -> 1

...

1111 1111 -> 255

这样三种不同的颜色以不同的级别组合在一起就可以表示 256 * 256 * 256 = 16777216 种颜色,我想应该够用了吧……

你能理解以上的内容,那么就可以明白图像(image)是怎么存储的啦。

先来看一张图片。

这张图像的尺寸是 600px * 664px。

你可能会问 px 是啥玩意,px -> pixel -> picture element,你可以理解为一个点,这个点通常还是一个正方形的。

我们把它放大一下。如下图所示:

看见了吗?实际上,大部分图像(你拍摄的,你用 PS 绘制的,扫描的,各种)都是位图文件,位图就是由像素点构成的,它就像是一个网格一样,每个格子里面填一个颜色。(除了位图外,还有一种图是矢量图)

我们将之前的图片存储为原来的 1 / 4 大小(155px * 166px),因为像素点变少了,我们看到的图像就很粗糙,不够细腻,看上去有锯齿。

注:此图像为截图,并不是缩小为 1 / 4 的原图,为了保证效果,放大到和上面原图相当的尺寸后截图下来的。

OK,我想题主你一定理解了图像是由像素构成的,像素就是一个正方形,图像就是由一大堆小正方形堆叠起来的一个大矩形。

接下来我们只需要把上面颜色的编码和这里的像素的知识结合在一起,你就明白图像是如何存储在计算机里的了。

上图!

如上图所示。

a 是一个 2 * 2 的小图像,总共有 4 个像素,每个像素呢,由三种颜色构成(b),而每种颜色呢,由 8 位构成(c),然后根据小图像的颜色,我们把颜色值写出来,为了方便书写,用 16 进制表示,如 d 图所示,四组数字,分别对应着小图像的四个像素。

我们可以把数值写成一行方便传输,但是如果你传输给别人的话,别人也许明白每组数值为颜色值,但是它可能会把图像解析成 4 * 1 的图像,因此你需要带上一些额外的信息,表示你的图像有多大的尺寸,因此你可以加一些字段啊什么的,比如 width:2,height:2 这样的。

你甚至可以加更多的字段,比如时间啊,作者啊,颜色深度啊,是否支持 alpha 啊各种……

01 和图像大致上就是这个关系吧。

但实际应用中,图像还伴随着压缩,因为如果耿直地存储这些图像(现在的手机,相机动不动就几百万像素),你可以简单地计算一下,你的电脑能存放几张图片就用完了你的大硬盘……

最后关于视频,视频实际上就是好多张好多张图像放成一个序列,然后轮着放出来给你看而已。当然,这个也伴随着压缩,虽然我们单张图像的压缩技术搞得蛮不错了,但是你耿直地存储他们的话(像云图这种三个小时的电影),估计也不行。

回答完毕。