3行Python 代碼實現(xiàn)圖片壓縮
大家好,我是一行
最近因為工作,經常需要在網站提交一些文件和圖片
但是在提交圖片的時候,有些網站總是會提醒我你的圖片文件過大,請?zhí)峤徊怀^ 2 MB大小的圖片、
想想也正常,不限制圖片大小容易被塞爆服務器,但是我手機這1億像素的照片讓我很難辦呀
而且在線壓縮的網站也有上限大小,不然就收費,不然就收費,不然就收費

這種簡單功能我要是還付費,豈不是丟了pythoner的face了嗎?!我把它實現(xiàn)了我也去上線~
1原理
仔細分析了一下,圖片壓縮的原理其實很簡單
簡單來說,像素圖片過大的原因不就是像素格太多了嘛
只要讀取所有像素,按規(guī)律刪掉或者合并像素格,圖片的就變小了
當然也要區(qū)別有損和無損的情況,只要視覺上過的去,那就沒什么問題
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)?

進階壓縮
進一步修改壓縮的代碼,可以設定壓縮圖片的目標大小
然后使用循環(huán)來迭代完成目標,最后封裝成函數,未來就可以批量壓縮圖片了
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最后
雖然說,程序員不必要去重復造輪子
但是想想有多少人上傳自己的身份證、畢業(yè)證等文件到這些在線平臺進行圖片壓縮
如果這些在線網站將個人信息的相關圖片都保存下來,日后加以利用,我的小愛語音助手可能接不過來電話了

所以說,對于個人信息安全還是需要保持謹慎
我是一行,技術用不眠,我們下期見~

對了,一行用爬蟲爬取了知乎里150000字的python學習攻略,并統(tǒng)計分析了這些年入百萬的python大佬所推薦的Python書單,花了很長時間整理成電子書合集如下圖所示,需要的可以添加一行微信好友「yihangpy」直接領取哦~

