某個(gè)夜深人靜的夜晚,夜微涼風(fēng)微揚(yáng),月光照進(jìn)我的書(shū)房~
當(dāng)我打開(kāi)文件夾以回顧往事之余,驚現(xiàn)許多看似雜亂的無(wú)聊代碼蒙挑。我拍腿正坐,一個(gè)想法油然而生:“生活已然很無(wú)聊愚臀,不如再無(wú)聊些叭”忆蚀。
于是,我決定開(kāi)一個(gè)專題,便稱之為kimol君的無(wú)聊小發(fā)明馋袜。
妙…啊~~~
就在昨天男旗,正當(dāng)我在刺激戰(zhàn)場(chǎng)廝殺時(shí),“叮叮短一溃”剑肯,微信來(lái)消息了。我心想:“這是腎馬情況观堂?” 我打開(kāi)一看让网,原來(lái)是小姐姐讓我?guī)兔μ幚碚掌瑍?樂(lè)于助人的我(小聲嘀咕:“我信你個(gè)鬼,壞得很”)师痕,自然是立馬放下游戲溃睹,奔向助人的前線,于是:
沒(méi)有錯(cuò)~ 面對(duì)來(lái)自小姐姐的任務(wù)胰坟,kimol君自是當(dāng)仍不讓因篇,打開(kāi)美圖秀秀,嗖嗖兩下便搞定了笔横,成功收獲兩顆小愛(ài)心????~
正當(dāng)我沾沾自喜的時(shí)候竞滓,小姐姐又發(fā)來(lái)一個(gè)壓縮包,說(shuō)是同學(xué)和閨蜜的吹缔,讓我?guī)兔σ黄鹋幌律逃印N掖蜷_(kāi)一看:
37張照片,我能怎么辦厢塘? 我也很絕望呀…
畢竟有一顆炙熱助人的心(畫(huà)外音:“畢竟是小姐姐讓幫忙”)茶没,不可能放著不管,但總不能一張一張的調(diào)叭晚碾,看來(lái)只能寫(xiě)一個(gè)小工具來(lái)批量處理了抓半。
其實(shí)格嘁,照片處理要求很簡(jiǎn)單笛求,主要是兩個(gè)方面:一個(gè)是調(diào)整圖片尺寸(即寬x高),另一個(gè)是調(diào)整圖片的大懈獠尽(即壓縮)涣易。為了實(shí)現(xiàn)這兩個(gè)功能,利用python中的PIL庫(kù)即可冶伞,其安裝方法如下:
pip install pillow
說(shuō)明:PIL官方版不支持python3,不過(guò)非官方pillow可作為其替代品。
導(dǎo)入相關(guān)的庫(kù):
fromPILimportImage
讀取圖片:
image=Image.open('xxx.jpg')
利用resize()函數(shù)即可對(duì)圖片的尺寸進(jìn)行調(diào)整:
image=image.resize((width,height))
其中width和height分別為預(yù)期調(diào)整的圖片寬和圖片高步氏。
利用save()函數(shù)即可對(duì)圖片進(jìn)行壓縮响禽,進(jìn)而調(diào)整其大小:
image.save('out.jpg',quality=60)
其中quality表示壓縮的比例。
首先一個(gè)函數(shù)隆嗅,用于調(diào)整圖片的尺寸:
defresize(inImage,width,height,inplace=False):'''
? ? 將圖片調(diào)整為指定尺寸
? ? ----------------------------
? ? 參數(shù) inImage:需要處理的圖片地址
? ? 參數(shù)? width:預(yù)期圖片寬度
? ? 參數(shù)? height:預(yù)期圖片高度
? ? 參數(shù) inplace:是否覆蓋原文件
? ? ----------------------------
? ? 返回 outImage:壓縮后的圖片地址
? ? '''ifnotinplace:# 如果不覆蓋outImage='%s-out.%s'%(inImage.split('.')[0],inImage.split('.')[1])else:outImage=inImage? ? image=Image.open(inImage)image=image.resize((width,height))image.save(outImage)print('"%s"調(diào)整成功!(尺寸:%dx%d)'%(inImage,width,height))returnoutImage
首先定義一個(gè)函數(shù)胖喳,用于獲取圖片的文件大小:
defget_size(fileName):'''
? ? 獲取圖片文件的大兄埂(KB)
? ? --------------------
? ? 參數(shù) fileName: 文件名
? ? --------------------
? ? 返回 fileSize:文件的大小
? ? '''fileSize=os.path.getsize(fileName)fileSize/=1024# 將單位轉(zhuǎn)為KBreturnfileSize
然后丽焊,通過(guò)不斷調(diào)整壓縮比率quality,來(lái)使得圖片到達(dá)指定的大小咕别,具體過(guò)程如下:
defcompress(inImage,targetSize,step=5,quality=75,inplace=False):'''
? ? 將圖片壓縮到指定的大小
? ? -------------------------------
? ? 參數(shù)? ? inImage:需要處理的圖片地址
? ? 參數(shù) targetSize:預(yù)期壓縮的大小
? ? 參數(shù)? ? ? step:每次迭代的壓縮比
? ? 參數(shù)? ? quality:初始?jí)嚎s比
? ? 參數(shù)? ? inplace:是否覆蓋原文件
? ? -------------------------------
? ? 返回 outImage:壓縮后的圖片地址
? ? '''ifnotinplace:# 如果不覆蓋outImage='%s-out.%s'%(inImage.split('.')[0],inImage.split('.')[1])else:outImage=inImage? ? fileSize=get_size(inImage)whilefileSize>targetSize:image=Image.open(inImage)image.save('temp.jpg',quality=quality)fileSize=get_size('temp.jpg')quality-=step# 調(diào)整壓縮比ifquality<0:print('"%s"壓縮失敿冀 !(請(qǐng)調(diào)整step)'%inImage)returnifos.path.exists('temp.jpg'):copyfile('temp.jpg',outImage)os.remove('temp.jpg')# 移處臨時(shí)文件print('"%s"壓縮成功惰拱!(大写萍:%.2fKB)'%(inImage,fileSize))returnoutImage
將resize()和compress()兩個(gè)函數(shù)整合到一起:
defadjust(inImage,width,height,targetSize,inplace=False):'''
? ? 將圖片調(diào)整為指定格式(包括尺寸及大谐ザ獭)
? ? -------------------------------
? ? 參數(shù)? ? inImage:需要處理的圖片地址
? ? 參數(shù)? ? ? width:預(yù)期圖片寬度
? ? 參數(shù)? ? height:預(yù)期圖片高度
? ? 參數(shù) targetSize:預(yù)期壓縮的大小
? ? 參數(shù)? ? inplace:是否覆蓋原文件
? ? -------------------------------
? ? 返回 outImage:調(diào)整后的圖片地址
? ? '''ifnotinplace:# 如果不覆蓋outImage='%s-out.%s'%(inImage.split('.')[0],inImage.split('.')[1])else:outImage=inImage? ? resize(inImage,width,height,inplace=inplace)compress(outImage,targetSize,inplace=True)returnoutImage
調(diào)用方法如下:
if__name__=='__main__':adjust('xxx.jpg',600,800,100)
隨后欣孤,通過(guò)寫(xiě)一個(gè)循環(huán),將壓縮包里的所有圖片進(jìn)行處理昔逗,便得到了預(yù)期的格式降传。
其實(shí),這個(gè)小工具還有許多可以完善的地方纤子,比如針對(duì)壓縮方式搬瑰、圖片質(zhì)量、效率等等都能做一些優(yōu)化控硼。此外泽论,當(dāng)然也可以考慮做一個(gè)GUI以更加方便的操作。感興趣的小伙伴卡乾,可以試試哦翼悴,沒(méi)準(zhǔn)哪天就有小姐姐找上門了呢~??
我是kimol君,咋們下次再會(huì)~
需要python自學(xué)資料的可以私信我哦
轉(zhuǎn)載:不正經(jīng)的kimol君
來(lái)源:csdn