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

這種簡(jiǎn)單功能我要是還付費(fèi),豈不是丟了pythoner的face了嗎?!我把它實(shí)現(xiàn)了我也去上線~
1原理
仔細(xì)分析了一下,圖片壓縮的原理其實(shí)很簡(jiǎn)單
簡(jiǎn)單來說,像素圖片過大的原因不就是像素格太多了嘛
只要讀取所有像素,按規(guī)律刪掉或者合并像素格,圖片的就變小了
當(dāng)然也要區(qū)別有損和無損的情況,只要視覺上過的去,那就沒什么問題
2代碼塊
簡(jiǎn)單壓縮
下面三行代碼完成了圖片從 9 MB到 327.65 KB 的壓縮效果
只需要使用PIL導(dǎo)入圖片,再按照壓縮率保存就可以了
下面這張結(jié)果圖,顯然壓縮過到我都認(rèn)出來的情況
from?PIL?import?Image
im?=?Image.open("pic/cat.jpg")
#?保存,quality是壓縮比率
im.save("cat-out2.jpg",?quality=1)?

進(jìn)階壓縮
進(jìn)一步修改壓縮的代碼,可以設(shè)定壓縮圖片的目標(biāo)大小
然后使用循環(huán)來迭代完成目標(biāo),最后封裝成函數(shù),未來就可以批量壓縮圖片了
def?compress_image(infile,?outfile='',?mb=1500,?step=10,?quality=80):
????"""不改變圖片尺寸壓縮到指定大小
????:param?infile:?壓縮源文件
????:param?outfile:?壓縮文件保存地址
????:param?mb:?壓縮目標(biāo),KB
????:param?step:?每次調(diào)整的壓縮比率
????:param?quality:?初始?jí)嚎s比率
????: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,肉眼也是看不出來有什么明顯差別,妥妥可以提交到網(wǎng)站上了

3最后
雖然說,程序員不必要去重復(fù)造輪子
但是想想有多少人上傳自己的身份證、畢業(yè)證等文件到這些在線平臺(tái)進(jìn)行圖片壓縮
如果這些在線網(wǎng)站將個(gè)人信息的相關(guān)圖片都保存下來,日后加以利用,我的小愛語音助手可能接不過來電話了

所以說,對(duì)于個(gè)人信息安全還是需要保持謹(jǐn)慎
我是一行,技術(shù)用不眠,我們下期見~

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

