链接:https://www.zhihu.com/question/36269548/answer/66734582
来源:知乎
首先你要知道01这玩意(二进制)如何表示数,假设位数是4位的话,
0001->1
0010->2
0011->3
...
左边是二进制,右边是十进制。
好,你能理解这个的话,这样任何数值都可以表示了。具体请搜索“进制转换”。
然后很久以前牛顿通过三棱镜把白色的光分解成七种不同颜色的光(实际上不是离散的吧,应该说分解成无数种颜色的光了哈哈哈)。
后来牛顿同学通过各种实验发现红,绿,蓝三种颜色的光是无法被分解的,因此我们就称为红绿蓝为光的三原色。
第一个要解决的问题是,每个颜色分量有多少个级别呢?假设三个分量(这里指3种原色rgb)只用一位(1 bit)来表示,那么就是0,1,也就是说,红色只有【有】与【无】两种情况,其他颜色也一样,因此三个颜色组合在一起就是2 * 2 * 2 = 8(这里是关键为什么不是7而是8呢,以为多了黑色,即三个原色都是无的情况下就是8种,数学的独立发生事件排列)种颜色。
那这样是在是太不实用了。
现在的计算机,一般使用32位来表示颜色,32位平分给四个分量(这里多了一种颜色就是ALPHA颜色了,故rgb+a 得死忠分量),也就是每个分量8位。
(为啥是四个颜色分量?)
其实,现在的颜色模型中有一个alpha值,用来表示透明度的,你可能会见到过ARGB这样的玩意,A就是表示alpha啦。
alpha我们先不管它。
那么红色Red,绿色Green,蓝色Blue,每个都有8位的空间来表示,能表示的级别就有2 ^ 8 = 256(0000 0000)~(1111 1111)种啦。也就是:
0000 0000 -> 0
0000 0001 -> 1
...
1111 1111 -> 255
这样三种不同的颜色以不同的级别组合在一起就可以表示 256 * 256 * 256 = 16777216种颜色,我想应该够用了吧……
你能理解以上的内容,那么就可以明白图像(image)是怎么存储的啦。
先来看一张图片。
你可能会问px是啥玩意,px = pixel = picture element (缩写),你可以理解为一个点,这个点通常还是一个正方形的。
我们把它放大一下。如下图所示:
<img src="https://pic1.zhimg.com/50/0f76611463e980409446e017517015e1_hd.jpg" data-rawwidth="1235" data-rawheight="862" class="origin_image zh-lightbox-thumb" width="1235" data-original="https://pic1.zhimg.com/0f76611463e980409446e017517015e1_r.jpg"> 看见了吗?实际上,大部分图像(你拍摄的,你用PS绘制的,扫描的,各种)都是位图文件,位图就是由像素点构成的,它就像是一个网格一样,每个格子里面填一个颜色。(除了位图外,还有一种图是矢量图)
我们将之前的图片存储为原来的1 / 4大小(155px * 166px),因为像素点变少了,我们看到的图像就很粗糙,不够细腻,看上去有锯齿。
OK,我想题主你一定理解了图像是由像素构成的,像素就是一个正方形,图像就是由一大堆小正方形堆叠起来的一个大矩形。
接下来我们只需要把上面颜色的编码和这里的像素的知识结合在一起,你就明白图像是如何存储在计算机里的了。
上图!
a是一个2 * 2的小图像,总共有4个像素,每个像素呢,由三种颜色构成(b),而每种颜色呢,由8位构成8进制8bit(c),然后根据小图像的颜色,我们把颜色值写出来,为了方便书写, 用16进制表示,如(d)图所示,四组数字(e),分别对应着小图像的四个像素。
我们可以把数值写成一行方便传输,但是如果你传输给别人的话,别人也许明白每组数值为颜色值,但是它可能会把图像解析成4 * 1的图像,因此你需要带上一些额外的信息,表示你的图像有多大的尺寸,因此你可以加一些字段啊什么的,比如width:2,height:2这样的。
你甚至可以加更多的字段,比如时间啊,作者啊,颜色深度啊,是否支持alpha啊各种……
01和图像大致上就是这个关系吧。
但实际应用中,图像还伴随着压缩,因为如果耿直得存储这些图像(现在的手机,相机动不动就几百万像素),你可以简单的计算一下,你的电脑能存放几张图片就用完了你的大硬盘……
最后关于视频,视频实际上就是好多张好多张图像放成一个序列,然后轮着放出来给你看而已。当然,这个也伴随着压缩,虽然我们单张图像的压缩技术搞得蛮不错了,但是你耿直的存储他们的话(像云图这种三个小时的电影),估计也不行。