手机中的照片体积大小压缩与照片质量直接的平衡优化
现在数码相机和手机拍照性能大幅度提升,而且手机由于其拍照便携性的优势,成为日常记录生活的手段,同时由于相机分辨率快速升级,拍照得到的照片越来越大。
相比于两千年初400w、800w像素的相机,近年来(2020后)手机相机分辨率基本上是1200w起步,4800w不算多,1个亿也有。导致拍照得到的JPEG图片分辨率增加3-10倍,同时很多手机厂商相机生成JPEG时,默认 质量因子
较高,导致JPEG图片的大小进一步放大。
分辨率
众所周知图片分辨率越高,其清晰度越好。
但分辨率和清晰度之间并不是完全直接对应的,还需要考虑图片中各个像素点的准确率。如果图片放大以后,很多地方都是噪点,那么虽然图片在缩小状态下清晰度极佳,但实际有效高分辨率并未带来有效的清晰度呈现。此时,保留较高的分辨率对于图片的清晰度增强作用就非常有限了。
手机的照相机由于体积限制,或者拍照过程中环境光线,或者拍照时的手法,或者相机/手机的稳定性等诸多因素影响,常常属于图片缩小状态看着非常清晰,但放大以后细节处就非常多噪点了。
由于JPEG(Joint Photographic Experts Group)图片压缩技术的特点,分辨率的增加,会直接线性增大图片占用空间大小。因为,JPEG压缩图片过程中,图片会被分成多个宽度和高度都是8x8像素点的小方块,然后对这些小块被做离散余弦变换。所以,随着照片分辨率增加,其占用的储存空间大小也直接线性放大。
1200w像素的JPEG照片相比于400w像素的照片,其他所有参数设置完全相同的情况下,前者占用的储存空间基本上会是后者的3倍。
质量因子(Quality Factor)
质量因子是JPEG图像压缩中的一个关键参数,涉及图片数据的量化处理强度,决定了图像压缩程度。质量因子通常是一个0-100的整数,其中0是压缩程度最高,质量最差,而100是压缩程度最低,质量最好(接近无损),质量因子合理取值范围是50-95。
通过人工智能得到质量因子不同取值范围的效果说明如下:
- 90-100:这个范围通常提供非常好的质量,对于大多数观察者来说,与原图的差异是难以察觉的。适合需要高质量图像的场合,比如专业摄影作品。
- 75-90:这个范围提供了很好的平衡,文件大小相对较小,而图像质量仍然很高,适合网页图像或家庭照片。
- 50-75:中等质量,适合不需要太高清的图像,如在线分享或电子邮件附件。在这个范围内,某些图片可能会开始显示出轻微的压缩瑕疵,尤其是对于纹理复杂或有大面积渐变的区域。
- 25-50:较低的质量,图像压缩更明显,可能会出现块状效应和颜色失真,适用于对图像质量要求不高但需要大幅度减小文件大小的场景。
照片压缩实践
明确分辨率
和质量因子
两特征对于JPEG照片大小的影响后,就可以针对性的优化手机拍摄的照片大小,并保留照片良好的清晰度。
关于分辨率
的优化
如果照片只是为了方便以后在手机上查看,或者发聊天群、发朋友圈等,那么并不需要保留照片的原始的超高分辨率。这就需要找到一个平衡点,确保图像在手机上仍然看起来清晰良好的或者可接受的。
现代智能手机的屏幕分辨率基本都已经达到Retina级别,但是屏幕的大小却只有6-7英寸,旗舰机的分辨率主要在1080p到1440p之间。所以,要让照片在手机上查看显示效果不发生劣化,那么将照片较长边调整到与手机屏幕的分辨率相匹配或稍高即可。此时,将照片在手机上全屏查看,能够以照片原始分辨率显示或直接匹配,既不会因为超分辨率而浪费存储空间或GPU处理能力,又不会因为照片分辨率小于屏幕分辨率导致屏幕上部分像素点缺少数据而只能通过拉伸周围像素进行拟合。
以屏幕分辨率2160x1080 pixel的手机为例。
可以考虑将照片的短边完全匹配屏幕宽度1080 pixel,然后按照片原始长宽比确定长边数值(如4:3的照片,1080x4/3=1440 pixel)。屏幕宽度方向上照片像素能够充分填满屏幕宽度方向的显示需求,同时,由于屏幕长度2160 pixel超出照片长边1440 pixel,照片完全显示的时候,让屏幕长边方保留空白,即可获得最优显示效果。
或者,将照片长边匹配屏幕长度方向2160 pixel,然后按照片原始长宽比确定短边(如4:3的照片,2160x3/4=1620 pixel),此时短边超出屏幕宽度1080 pixel,即使拉伸照片使得照片长边完全填满屏幕,让短边在屏幕宽度方向的部分像素点超出范围(不显示),也可以确保屏幕的全部像素点被照片像素点充满。
通过上述基于屏幕高度或宽度计算的结果,取两者的中间数值,平衡高度和宽度方向的显示效果和照片文件大小。将照片分辨率压缩到大约1600x1200至2000x1500像素,是不错的选择。
关于质量因子
的优化
如上查找的资料所说,压缩JPEG照片的时候,质量因子取75-90范围可以提供了很好的平衡,照片体积较小,且照片质量很高,适合家庭照片保存。
目前,已知网络上各种JPEG图片显示效果和质量因子取值对应关系信息如下。
微信发送的照片有时会把质量因子压到70,照片放大后会看到比较明显的伪影/振铃效应,所以质量因子取值大于80可能会是一个不错的选择。
手机相机生成的照片很多都是94-97,甚至98,照片压缩成JPEG格式的时候,整体和RAW源文件的差异其实较小,而且照片文件较大。
使用FFMPEG压缩JPEG的时候,可选参数为
q
的取值最小为2,此时照片质量最高,对应的质量因子
是91,实际照片效果确实不错。使用谷歌picasa进行照片分辨率调整的时候,默认的
质量因子
是85,导出照片放大到100%时,显示效果较好。
综上,JPEG质量因子范围设置在75 - 90之间通常能够提供很好的质量和文件大小平衡,并避免肉眼可见的瑕疵。但如果照片包含大量细节,则需要更高的质量因子才能确保不出现显示瑕疵。
具体实践后,发现想要确保照片在手机上看起来尽可能清晰,将质量因子设置在80到85之间,可以提供足够好的照片质量,照片的边缘细节保持得非常清晰,压缩后的照片在手机屏幕上几乎与原始照片基本无法区分。
使用FFMPEG批量压缩照片
可以通过Windows的Command命令行使用FFMPEG进行批量照片压缩处理,代码如下:
for %%i in (*.jpg) do ffmpeg.exe -i ".\%%i" -vf scale=1600:-1 -q:v 4 ".\output\%%i.jpg"
代码说明:
- 参数-vf scale=1600:-1表示:调整照片分辨率的宽度为1600,按照原始比例自动计算高度,
- 参数-q:v是质量因子参数。FFMPEG使用-q:v(或别名-qscale:v)作为输出选项,FFMPEG中JPG的quality取值范围是 2-31,其中 31 是最差的质量。比例是线性的,qscale 的两倍大约是比特率的一半。
质量因子q:v建议尝试 2-5 的值。