python批量压缩图像的完整步骤

目录
  • 背景
  • 解决方案
  • 操作步骤
    • 要求
    • 步骤
  • 附:批量将图片的大小设置为指定大小
  • 写在后面

背景

今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过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文件夹下,打开终端。

直接运行的脚本:

python ic.py xxx_文件夹

等待一会,就会将整个文件夹下的所有图片都转化好了。

完整代码:

如果上不去GitHub的话,我直接把代码放在这里,保存为一个python文件即可。比如保存的文件名为:ic.py

from PIL import Image
from glob import glob
import os
from tqdm import tqdm
import shutil
import sys
from itertools import chain

from multiprocessing import Pool

# image_dir = "image_dir"
template_dir = 'template'
output_dir = 'output'
error_dir = 'error'

def clean_dir(dir_name):
    if os.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_list

def imagesize(filepath):
    """
    获得文件的磁盘大小
    :param filepath:
    :return:
    """
    return os.path.getsize(filepath) / 1024

def compress_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  # kb

    try:

        if imagesize(image_path) < target_size:

            shutil.copyfile(image_path, output_image)
        else:
            width, height = raw_image.size
            raw_image.resize((int(width * 0.9), int(height * 0.9)), Image.ANTIALIAS).save(template_image)
            while imagesize(template_image) > target_size:
                template_iamge2 = Image.open(template_image)
                width_2, height_2 = template_iamge2.size
                template_iamge2.resize((int(width_2 * 0.9), int(height_2 * 0.9)), Image.ANTIALIAS).save(template_image)

            shutil.copyfile(template_image, output_image)
    except Exception as e:
        shutil.copyfile(image_path, error_image)
        print(f'文件保存失败: {image_path}')
        # print(e)

if __name__ == '__main__':
    # 批量创建文件夹
    [clean_dir(i) for i in [template_dir, output_dir, error_dir]]

    image_dir = sys.argv[1]

    image_file_list = list(chain(*[glob(os.path.join(image_dir, i)) for i in ['*.png', '*.jpg', '*.jpeg']]))

    # for temp_image_path in tqdm(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')

    # parallel
    P = 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)) for i in
                image_file_list]

    _ = [res.get() for res in res_temp]

附:批量将图片的大小设置为指定大小

import os

from PIL import Image

# 源目录

project_dir = os.path.dirname(os.path.abspath(__file__))

input = os.path.join(project_dir, 'src')

# 输出目录

output = os.path.join(project_dir, 'dest')

def modify():

    # 切换目录

    os.chdir(input)

    # 遍历目录下所有的文件

    for image_name in os.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()

写在后面

这个代码说起来难,说起来也不难,如果认真看我历史的文章的话,上面代码中遇到的知识点都就会了。像是所谓的图像压缩、并行处理之类的,其实并不难。

到此这篇关于python批量压缩图像的文章就介绍到这了,更多相关python批量压缩图像内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python利用Guetzli批量压缩图片

    Google 又开源了,这次开源了一款图像算法工具 Guetzli.Guetzli,在瑞士德语中是"cookie(曲奇)"的意思,是一个针对数码图像和网页图像的 JPEG 编码器,能够通过产生更小的 JPEG 文件来达到更快的在线体验,并且同时保持与当前浏览器,图像处理应用和 JPEG 标准的兼容性.Google 称 Guetzli 创建高质量的 JPEG 图像文件的大小比当前的压缩方法要再小 35%. 今天玩了下谷歌的开源图片压缩工具Guetzli,发现单张图片压缩效果还是不错的,就

  • Python实现批量压缩图片

    本文为大家分享了Python实现批量压缩图片的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- """ __author__= 'Du' __creation_time__= '2018/1/5 10:06' """ import os from PIL import Image import glob DIR = 'C:/Users/Public/Pictures/Sample Pictures/' class

  • python 无损批量压缩图片(支持保留图片信息)的示例

    由于云盘空间有限,照片尺寸也是很大,所以写个Python程序压缩一下照片,腾出一些云盘空间 1.批量压缩照片 新建 photo_compress.py 代码如下 # -*- coding: utf-8 -*- """脚本功能说明:使用 tinypng api,一键批量压缩指定文件(夹)所有文件""" import os import sys from concurrent.futures import ThreadPoolExecutor, Pr

  • python实现图片批量压缩程序

    本文实例为大家分享了python实现图片批量压缩程序的具体代码,供大家参考,具体内容如下 说明 运行环境:Win10 Pycharm 程序没有用到面向对象编程方法,只是简单的面向过程设计 用到的模块:PIL.os.sys 使用方法: 在Pycharm的terminal中输入"python xxx.py source_dir dest_dir"就可以把source_dir中的图片文件进行压缩并保存到dest_dir中 源码 from PIL import Image import os

  • python实现图片批量压缩

    项目中大量用到图片加载,由于图片太大,加载速度很慢,因此需要对文件进行统一压缩 第一种 一:安装包 python -m pip install Pillow 二:导入包 from PIL import Image import os 三:获取图片文件的大小 def get_size(file): # 获取文件大小:KB size = os.path.getsize(file) return size / 1024 四:输出文件夹下的文件 dir_path = r'file_path' items

  • python批量压缩图像的完整步骤

    目录 背景 解决方案 操作步骤 要求 步骤 附:批量将图片的大小设置为指定大小 写在后面 背景 今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB.但是同事又有很多照片.这要是每一个照片都用ps压缩的话,那岂不是很崩溃.于是我写了一个脚本,可以批量压缩图片到指定大小.直接造福同事.提高同事的工作效率. 解决方案 其实也不用卖关子了,就是使用python的pillow包就可以对图片进行压缩,如果一个图片已经压缩到指定大小了,那就停止压缩,如果没有达到指定大小,那就对压缩

  • 使用Python批量压缩tif文件操作步骤

    1.前言 我在进行DEM数据的裁剪时,发现各个省的数据量非常大,比如说四川省的30m的DEM数据的大小为2G.考虑到有限的电脑磁盘空间,我对Tif文件采用了LZW压缩. 2.流程 3.批量压缩代码 #文件夹中每个文件都进行压缩 # -*- coding: utf-8 -*- import rasterio as rio import rasterio import os from tqdm import tqdm #每个线程选择一个文件夹 Input_path ="输入文件夹"+&qu

  • 利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)

    前言 本文主要给大家介绍的关于Python批量压缩png的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 1.需求 为什么会有这个需求?是因为游戏的资源大多是png图片,需要压缩,但是有些图片和文件夹里的图片,美术不想压缩,比如一些带透明度的光圈或者游戏的主要元素.所以要过滤下.发现python这个语言比较适合用在这个场景.所以写了点python. 2.源码 import os,sys import os.path rootdir=sys.path[0] #需要过滤的文

  • 用python 批量更改图像尺寸到统一大小的方法

    如下所示: #提取目录下所有图片,更改尺寸后保存到另一目录 from PIL import Image import os.path import glob def convertjpg(jpgfile,outdir,width=128,height=128): img=Image.open(jpgfile) try: new_img=img.resize((width,height),Image.BILINEAR) new_img.save(os.path.join(outdir,os.pat

  • python 批量压缩图片的脚本

    简介 用Python批量压缩图片,把文件夹或图片直接拖入即可 需要 Needs Python 3 Pillow (用pip install pillow来安装即可) 用法 Usage 把文件夹或图片直接拖入即可.如果拖入的是文件夹,则会遍历子文件夹把所有图片都压缩了. 注意,压缩后的文件会直接替换原来的文件,文件名不变,尺寸不变,只改变压缩质量. 文件的开头有两个变量: SIZE_CUT = 4 表示大于4MB的图片都会进行压缩 QUALITY = 90 表示压缩质量90,这个质量基本人眼是看不

  • python SVD压缩图像的实现代码

    前言 利用SVD是可以对图像进行压缩的,其核心原因在于,图像的像素之间具有高度的相关性. 代码 # -*- coding: utf-8 -*- ''' author@cclplus date:2019/11/3 ''' import cv2 import matplotlib as mpl import numpy as np import matplotlib.pyplot as plt #转为u8类型 def restore1(u, sigma, v, k): m = len(u) n =

  • python+requests实现接口测试的完整步骤

    本文包括requests库的安装过程.requests库的基本语法以及一个实例(携带token登录对人员进行注册) 一.requests安装 可以通过控制台输入命令pip install requests安装requests,但是我这里主要介绍pycharm工具中安装requests 一张图解释安装步骤,简单快捷 二.requests常用语法 1.基本请求方法,包含参数传递 (1)get参数传递,示例: url="xxxxx" xx={ "xxx":"xx

  • python自动发送QQ邮箱的完整步骤

    目录 一.授权码获取 二.发送文本和附件 三.继续升级 四.声明 一.授权码获取 开启它: 发送短信: 发送后点击我已发送: 把这个授权码复制下来保存起来,下次还可以用. 二.发送文本和附件 你只需要修改邮箱,授权码,当然如果你想发送附件也把附件路径加上即可. python代码: # coding=gbk """ 作者:川川 @时间 : 2021/11/10 10:50 群:970353786 """ import smtplib from em

  • Python实现批量压缩文件/文件夹zipfile的使用

    目录 [Python压缩文件夹]导入"zipfile"模块 [python压缩文件]导入"zipfile"模块 补充 zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的, 在这里对zipfile的使用方法做一些记录.即方便自己也方便别人. Python zipfile模块用来做zip格式编码的压缩和解压缩的,要进行相关操作,首先需要实例化一个 ZipFile 对象.ZipFile 接受一个字

  • Python批量解压&压缩文件夹的示例代码

    目录 一.python批量解压 二.python批量压缩 一.python批量解压 提示:如果是重要数据解压前请先备份,解压后会覆盖原压缩文件!! 解压前: 解压后:文件名为英文: 文件名中包含中文: 代码如下 import os import shutil import zipfile # 首先引入需要的工具包 # shutil为后期移动文件所需,可以忽略此项 # 路径改这里! #parent_path = r'输入路径,会解压该路径下的所有zip压缩文件' parent_path = r'E

随机推荐