1. 程式人生 > 其它 >Python處理圖片壓縮

Python處理圖片壓縮

技術標籤:python隨筆python

繼上次女朋友用五塊錢加瓶可樂,換我一個抽獎程式後,她她她,又來了。

本著吃瓜第一,乾飯第二的優秀原則,我選擇了拒絕。畢竟最近的瓜瓜太好吃了,一會是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()

注意,並不是簡單的壓縮,如果你的輸入檔案大小遠小於要壓縮的目標大小,會進行部分擴大。