Python處理圖片壓縮
阿新 • • 發佈:2021-02-03
繼上次女朋友用五塊錢加瓶可樂,換我一個抽獎程式後,她她她,又來了。
本著吃瓜第一,乾飯第二的優秀原則,我選擇了拒絕。畢竟最近的瓜瓜太好吃了,一會是ZS和ZH的代孕風波,雖然她抽菸、喝酒、出軌、耍大牌,但是她是一個好女孩呀。一會又是天王ZJL和上海乘務長的激情故事。刺激,太刺激了。哪來的空再去做需求。我今天就是死,從這跳下去,也不做女朋友的廉價需求。
來吧,看看需求。啥,你說啥,啥男兒尊嚴?男子漢能屈能伸,眼睛有點近視,聽不清你在說啥。畢竟這年頭騙個女朋友不容易。
需求:要對很多圖片進行壓縮處理,量太大,用PS累死人。
來吧,廢話不多說,翠花,上酸菜。
檔案目錄:
資料夾in_pictures : 放圖片的目錄 資料夾out_pictures : 輸出圖片的目錄 config.xml : 配置檔案
config.xml 指定輸入、輸出目錄,以及壓縮到檔案的大小
<?xml version="1.0"?> <config> <in_path>in_pictures</in_path> <out_path>out_pictures</out_path> <end_size>10240</end_size> <!--kb--> </config>
pic_compress.py 壓縮程式碼
# -*- coding: utf-8 -*- from PIL import Image import os from xml.dom.minidom import parse in_path = '' out_path = '' end_size = 1024 succ_count = 0 all_count = 0 def get_inpictures() : all_pictures = [] end_path = os.getcwd() + '\\' + in_path g = os.walk(end_path) for _, _, filelist in g : for filename in filelist : if filename.endswith('jpg') or filename.endswith('png') or \ filename.endswith('jpeg') : all_pictures.append(filename) global all_count all_count = len(all_pictures) return all_pictures # 讀XML def read_xml() : doc = parse('./config.xml') root = doc.documentElement global in_path, out_path, end_size in_path = root.getElementsByTagName('in_path')[0].firstChild.data out_path = root.getElementsByTagName('out_path')[0].firstChild.data end_size = int(root.getElementsByTagName('end_size')[0].firstChild.data) def do_compress(in_pic) : global succ_count quality = 100 step = 10 in_pic_name = os.getcwd() + '\\' + in_path + '\\' + in_pic #輸入圖片 out_pic_name = os.getcwd() + '\\' + out_path + '\\' + in_pic #輸出圖片 #print(in_pic_name, out_pic_name) im = Image.open(in_pic_name) im.save(out_pic_name, quality=quality) o_size = os.path.getsize(out_pic_name) / 1024 # K為單位 succ_flag = True while o_size > end_size : quality -= step if quality <= 0 : print('error !!! file:', in_pic_name) succ_flag = False break #print('size ', o_size, ' step ', step, ' quality ', quality) im = Image.open(in_pic_name) im.save(out_pic_name, quality=quality) # quality表示壓縮比率 o_size = os.path.getsize(out_pic_name) / 1024 if succ_flag : succ_count += 1 # 壓縮 def compress(all_pictures) : for pic in all_pictures : do_compress(pic) if all_count : print('success !!! all_pictures_num: %d, succ_num: %d' %(all_count, succ_count)) # 清空目標目錄 def clear_out_path() : path = os.getcwd() + '\\' + out_path for file in os.listdir(path) : file_data = path + '\\' + file if os.path.isfile(file_data) : os.remove(file_data) def main() : read_xml() clear_out_path() all_pictures = get_inpictures() compress(all_pictures) main()
注意,並不是簡單的壓縮,如果你的輸入檔案大小遠小於要壓縮的目標大小,會進行部分擴大。