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()

       注意,并不是简单的压缩,如果你的输入文件大小远小于要压缩的目标大小,会进行部分扩大。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值