python对于jpg及png图⽚压缩-菜鸟⽇记
情景介绍
之前公司新开发⼀款做图⽚处理的⼩程序的产品。
进⼊⼩程序的时候会⾸页会加载数量20+的展⽰图(等⽐压缩返回较⼩像素的图⽚ + 分页就可以解决加载缓慢的问题)。
但是每个展⽰的模板图点击可以加载详情,详情⾥⾯所展⽰的图⽚是由N个图⽚元素组合起来的(展⽰图理解成⼀块画布上⾯画了桌⼦,苹果,⾹蕉,西⽠,梨各种图案,详情⾥⾯有⼀张画布画了桌⼦,⼀张画布画了苹果等等,然后拼接到⼀起,这样做的好处就是,当需要对某个元素进⾏替换的时候,替换其中某⼀块画布就⾏~~~~有点像雕版印刷术和活字印刷术的区别)。
当元素较多的时候,免不了出现加载速度慢,流量消耗⼤的问题。
那就得尝试修改⽂件⼤⼩
⾸先明确⼀点,我们不能修改⽤来展⽰的所有初始图⽚的像素,因为某个像素⼀旦修改,会打乱他在整个图⽚上⾯的布局⽐例。
我⼀般使⽤python模块的PIL(Pillow)来处理图⽚的,⽽PIL在保存jpg图⽚时候有⼀个quality参数,是⽤来控制图⽚质量的(阈值是1-95)。
img.save('test.png', quality=75, format='JPEG')
然后可以发现jpg图⽚是可以通过‘降质’处理的,改变⽂件⼤⼩却不改变图⽚像素。
PIL默认会保存质量为75的图⽚,所以哪怕直接读取再保存图⽚,也会发现新的图⽚⽂件⼤⼩被修改了。
那这⾥怎么控制‘⽆损’保存呢?
img.save('test.png', quality=100, subsampling=0, format='JPEG')
如果只单纯的将quality设置为100,PIL保存的图像仍与原始图像略有不同。这是因为PIL会处理图⽚减⼩图像⼤⼩,这时候必须将subsampling设定为0,关闭图⽚修改。
但是~现在不得不⾯对⼀个问题,我们的图⽚都是PNG的。
为什么要⽤PNG图⽚呢,因为PNG图⽚可以将背景设置成透明的⽽JPG不可以(具体涉及到图⽚三通道/四通道之类的东东,楼主也不是很清楚)
菜鸟编辑器python简单形容下JPG不能使⽤透明画布,当多个图⽚叠加的时候,没有图画的⾮透明部分会遮挡后⾯图⽚,不适合⽤来做组合图。
那我们就得想办法对PNG图⽚进⾏不改变像素的情况下进⾏⽂件⼤⼩压缩。
⽽PNG图⽚⼤⼩是不受质量约束的
然后查了很多资料,然⽽~很抱歉,楼主并没有到好的PNG图⽚压缩办法
类似PIL的vert()修改图⽚属性来修改图⽚⼤⼩,也不是我们需要的。
⽆奈之下改变了⼀下思路,有没有可⽤的,免费的,好⽤的第三⽅接⼝(⽩嫖党要求还挺⾼)。
然后到了这个图⽚压缩第三⽅API,楼主试⽤上百张图⽚,发现在不改变像素的⼤⼩为前提下,⼤概的压缩⽐例是接近5:1的,⽽且基于⾁眼来说没有发现明显区别。
最主要的是python对这个接⼝有封装好的模块tinify pip install tinify
使⽤也极其便捷
from tinify import tinify
tinify.key= '在上述⽹址中获取的key'
tinify.from_file('path').to_file('new_path')即可将压缩好的PNG图⽚保存⾄本地
以上
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论