为什么两张图片dpi、分辨率都一样,文件体积大小却相差很大?
这要从图片的存储方式说起
一张彩色图片都是由3张黑白图片组成的,那3张灰度(黑白)图片分别是图片中红色、绿色、蓝色的信息,显示的时候红绿蓝3个通道的图片合起来显示出彩色的图片:
也就是说,红绿蓝3个通道的取值是独立的。而每个通道的一个像素点是一个取值为0~255的整数。
3个通道的值合起来就是我们常常表示的一个像素点: RGB(255,33,222),图片压缩的本质就是去除冗余信息、保留有效信息。图片所含信息量越多、体积越大,能压缩的空间也就越少,而不同颜色组成的图片所含信息量是不同的!
下面说的图片体积都是压缩后(包括无损压缩)的体积。
红色有2个0值通道,橙色1个,紫色没有。
所以所含信息: 红色lt;橙色lt;深紫色(这只为便于理解是给出一个直观感受:色彩表示方式会影响图片大小)
没有什么图片是只有一种颜色,实际上准确来说是色调影响图片的大小:红色调的图片信息集中在红色通道,而橙色调图片的信息分散在红色和绿色通道。不同色调的图片大小不同,而一种颜色的图片重复信息太多、压缩空间太大,不明显。而当图片通道值分布的更广(0~255)时差距就体现出来了。
比如做一个纯色彩的径向渐变(从某个色彩渐变到纯黑的圆形渐变,之所以不用单方向的线性渐变是为了使压缩的效果体现的更明显)
自己可以用PhotoShop等图片编辑工具试一试,不过要记得使用存储为Web格式,并且把元数据选项设置为”无“,这么做可以剔除图片其他附属信息的干扰。如果主色调是红色这种信息只在一个通道的图片体积就要小(可压缩空间大):
//实际上红色色调的图,算是使用2个通道(另外两个通道值数值是相等值)
//青色色调的图算使用是2~3通道之间(一部分两个通道数值是相等,另一部分3个通道都不相等)
纯红色调(2.19MB) - (255,0,0)
而当用这种青色,这种信息要占用2个通道的颜色时:
青色调(2.71MB) -(0,255,216)
2.19:2.71,有20%的体积差别,这已经不是细微差别了,而用到三个通道的紫色(3.09MB)就有了30%的差距了。
紫色调(3.09MB) - (184,35,105)
饱和度对图片体积的影响
前面说的是色相对图片体积的影响,而饱和度对图片体积也有影响。饱和度越低,色彩RGB三个值越接近,也就是说值变化的范围越小,所含信息越少,可压缩空间就越大。
低饱和度的颜色:
当饱和度降到0时:图片体积最小化了(亮度相同时),3通道值完全一样了。
0饱和度(1.8MB)
亮度对图片体积的影响
这个应该很好理解,本来一张图片色彩取值是0~255,(RGB:255,255,255 就是最亮的白色),亮度调低了,最大值就减小了,取值就变成0~125了,信息就被削减了,可压缩空间也就增加了,这是上面那张紫色调(3.09MB)降低亮度以后的图,只剩下2MB了,体积减小了1/3。
另外图片色彩的动态范围也会对体积产生影响(ps里用曲线或对比度调)
青.jpg(1.64MB)
紫.jpg(2.13MB)
一些补充
1.关于蓝色、紫色都是纯色,为什么色彩不同,压缩后体积大小却有变化
色彩都是人规定的,当人们规定所有色彩按RGB(红绿蓝)表示时,就决定了只有红、绿、蓝的图片压缩后体积会更小,纯紫色(255,0,255)跟蓝色(0,0,255)压缩后大小是差不多的,因为虽然要用两个通道表示,但是2个通道是相等的,不过只要不是那么纯,比如(234,0,255),大小就会变大很多。
2.关于有人还是不理解为什么一些颜色比另一些颜色占用空间大
可以用文本来类比,我们知道文本中中文所占空间要比字母、数字大,因为字母是用1个字节表示,而中文要用2个字节表示,有些少见的Unicode字符甚至要用3个字节表示。这是因为字母在编码上排在前面,而中文排在后面,用的数字更大,需要更多的空间存储。
颜色也是一样的,24位的颜色有256*256*256=16777216种。跟文本一样,编码色彩:256之前的色彩可以用一个字节表示,257~65536可以用2个字节表示,而再之后的色彩就必须用3个字节表示。有些色彩就是会比另一些存储下来占用空间大,而我们都用RGB作为基础标准,所以红绿蓝色调占用空间要小。
本文采编自知乎,作者“不知语冰”,著作权归作者所有。
https://www.zhihu.com/question/23450044/answer/33759435