python批量压缩图像的完整步骤是什么
导读:本文共2935字符,通常情况下阅读需要10分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 背景今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB。但是同事又有很多照片。这要是每一个照片都用ps压缩的话,那岂不是很崩溃。于是我写了一个脚本,可以批量压缩图片到指定大小。直接造福同事、提高同事的工作效率。解决方案其实也不用卖关子了,就是使用python的pillow包就可以对图片进行压缩,如果一个图片已经压缩到指定大小了,那就停... ...
目录
(为您整理了一些要点),点击可以直达。背景
今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB。但是同事又有很多照片。这要是每一个照片都用ps压缩的话,那岂不是很崩溃。于是我写了一个脚本,可以批量压缩图片到指定大小。直接造福同事、提高同事的工作效率。
解决方案
其实也不用卖关子了,就是使用python的pillow包就可以对图片进行压缩,如果一个图片已经压缩到指定大小了,那就停止压缩,如果没有达到指定大小,那就对压缩后的图片再进行压缩,直到压缩到自定范围内。
可是为什么不在网上找代码呢?我也是找过,但是发现很多代码质量参差不齐,都达不到我想要的效果,而且很不优雅。于是我随手就写了一个代码,不仅仅代码写的简单,而且逻辑清楚,最后为了效率,我还做了一个并行,同时使用10个进程处理。说实话,那可是真的飞快。
操作步骤
要求
默认是使用的是Anaconda的环境。
将所有要压缩的图片都放在一个文件夹下,然后每个图片的格式只能是下面三种:png,jpg, jpeg。如果是PNG也不行。因为PNG是png的大写。
代码中设置的图像的压缩后的大小是512KB,那么你可以设置代码中的target_size为500,只要比512KB小就行了。
然后把我的代码从GitHub上下载下来。代码链接为:https://github.com/yuanzhoulvpi2017/tiny_python/blob/main/image_compression/ic.py
步骤
我这里把所有图片都放在了一个文件夹里面,文件夹名称为历史截图。然后我的这个历史截图和ic.py代码都放在了little_code文件夹中。
在little_code文件夹下,打开终端。
直接运行的脚本:
pythonic.pyxxx_文件夹
等待一会,就会将整个文件夹下的所有图片都转化好了。
完整代码:
如果上不去GitHub的话,我直接把代码放在这里,保存为一个python文件即可。比如保存的文件名为:ic.py
fromPILimportImagefromglobimportglobimportosfromtqdmimporttqdmimportshutilimportsysfromitertoolsimportchainfrommultiprocessingimportPool#image_dir="image_dir"template_dir='template'output_dir='output'error_dir='error'defclean_dir(dir_name):ifos.path.exists(dir_name):shutil.rmtree(dir_name)os.makedirs(dir_name)else:os.makedirs(dir_name)#image_file_list=glob(f"{image_dir}/*")#image_file_listdefimagesize(filepath):"""获得文件的磁盘大小:paramfilepath::return:"""returnos.path.getsize(filepath)/1024defcompress_image(image_path):raw_image=Image.open(image_path)temp_image_name=image_path.split(os.sep)[-1]template_image=os.path.join(template_dir,temp_image_name)output_image=os.path.join(output_dir,temp_image_name)error_image=os.path.join(error_dir,temp_image_name)target_size=500#kbtry:ifimagesize(image_path)<target_size:shutil.copyfile(image_path,output_image)else:width,height=raw_image.sizeraw_image.resize((int(width*0.9),int(height*0.9)),Image.ANTIALIAS).save(template_image)whileimagesize(template_image)>target_size:template_iamge2=Image.open(template_image)width_2,height_2=template_iamge2.sizetemplate_iamge2.resize((int(width_2*0.9),int(height_2*0.9)),Image.ANTIALIAS).save(template_image)shutil.copyfile(template_image,output_image)exceptExceptionase:shutil.copyfile(image_path,error_image)print(f'文件保存失败:{image_path}')#print(e)if__name__=='__main__':#批量创建文件夹[clean_dir(i)foriin[template_dir,output_dir,error_dir]]image_dir=sys.argv[1]image_file_list=list(chain(*[glob(os.path.join(image_dir,i))foriin['*.png','*.jpg','*.jpeg']]))#fortemp_image_pathintqdm(image_file_list):#compress_image(temp_image_path)print(f'\n\n文件保存父目录:{os.getcwd()}\n'f'输出文件位置:{os.path.join(os.getcwd(),output_dir)}\n\n')#parallelP=Pool(processes=10)pbar=tqdm(total=len(image_file_list))res_temp=[P.apply_async(func=compress_image,args=(i,),callback=lambda_:pbar.update(1))foriinimage_file_list]_=[res.get()forresinres_temp]
附:批量将图片的大小设置为指定大小
importosfromPILimportImage#源目录project_dir=os.path.dirname(os.path.abspath(__file__))input=os.path.join(project_dir,'src')#输出目录output=os.path.join(project_dir,'dest')defmodify():#切换目录os.chdir(input)#遍历目录下所有的文件forimage_nameinos.listdir(os.getcwd()):print(image_name)im=Image.open(os.path.join(input,image_name))im.thumbnail((128,128))im.save(os.path.join(output,image_name))if__name__=='__main__':modify()
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
python批量压缩图像的完整步骤是什么的详细内容,希望对您有所帮助,信息来源于网络。