3行Python 代码实现图片压缩


最近因为工作,经常需要在网站提交一些文件和图片

但是在提交图片的时候,有些网站总是会提醒我你的图片文件过大,请提交不超过 2 MB大小的图片、

想想也正常,不限制图片大小容易被塞爆服务器,但是我手机这1亿像素的照片让我很难办呀

而且在线压缩的网站也有上限大小,不然就收费,不然就收费,不然就收费3行Python 代码实现图片压缩

这种简单功能我要是还付费,岂不是丢了pythoner的face了吗?!我把它实现了我也去上线~

1原理

仔细分析了一下,图片压缩的原理其实很简单

简单来说,像素图片过大的原因不就是像素格太多了嘛

只要读取所有像素,按规律删掉或者合并像素格,图片的就变小了

当然也要区别有损和无损的情况,只要视觉上过的去,那就没什么问题

2代码块

简单压缩

下面三行代码完成了图片从 9 MB到 327.65 KB 的压缩效果

只需要使用PIL导入图片,再按照压缩率保存就可以了

下面这张结果图,显然压缩过到我都认出来的情况

from PIL import Image

im = Image.open("pic/cat.jpg")
# 保存,quality是压缩比率
im.save("cat-out2.jpg", quality=1) 

3行Python 代码实现图片压缩进阶压缩

进一步修改压缩的代码,可以设定压缩图片的目标大小

然后使用循环来迭代完成目标,最后封装成函数,未来就可以批量压缩图片了

def compress_image(infile, outfile='', mb=1500, step=10, quality=80):
    """不改变图片尺寸压缩到指定大小
    :param infile: 压缩源文件
    :param outfile: 压缩文件保存地址
    :param mb: 压缩目标,KB
    :param step: 每次调整的压缩比率
    :param quality: 初始压缩比率
    :return: 压缩文件地址,压缩文件大小
    """
    o_size = os.path.getsize(file)/1024
    if o_size <= mb:
        return infile
    outfile = get_outfile(infile, outfile)
    while o_size > mb:
        im = Image.open(infile)
        im.save(outfile, quality=quality)
        if quality - step < 0:
            break
        quality -= step
        o_size = get_size(outfile)
    return outfile, get_size(outfile)

像这样从9 MB 压缩到 1.47 MB,肉眼也是看不出来有什么明显差别,妥妥可以提交到网站上了3行Python 代码实现图片压缩

3最后

虽然说,程序员不必要去重复造*

但是想想有多少人上传自己的身份证、毕业证等文件到这些在线平台进行图片压缩

如果这些在线网站将个人信息的相关图片都保存下来,日后加以利用,我的小爱语音助手可能接不过来电话了3行Python 代码实现图片压缩

居然还聊起来了

所以说,对于个人信息安全还是需要保持谨慎

我是一行,技术用不眠,我们下期见~



上一篇:ASP.NET Ajax实现图片剪裁


下一篇:如何使用BOL接口set_property修改SAP CRM BO实例的某个属性