广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python批量压缩图像的完整步骤
  • 323
分享到

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

2024-04-02 19:04:59 323人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录背景解决方案操作步骤要求步骤附:批量将图片的大小设置为指定大小写在后面背景 今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB。但是同事又有很多照片。

背景

今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过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批量压缩图像内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python批量压缩图像的完整步骤

本文链接: https://www.lsjlt.com/news/160469.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python批量压缩图像的完整步骤
    目录背景解决方案操作步骤要求步骤附:批量将图片的大小设置为指定大小写在后面背景 今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB。但是同事又有很多照片。...
    99+
    2022-11-12
  • python批量压缩图像的完整步骤是什么
    这期内容当中小编将会给大家带来有关python批量压缩图像的完整步骤是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。背景今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB。...
    99+
    2023-06-22
  • nginx开启gzip压缩的完整步骤记录
    目录前言一、配置gzip压缩二、配置详解三、 重启nginx服务总结 前言 开启网站gzip压缩,是一个网站最常用的一个增加访问速度的方式,通过压缩静态资源,从而增加网站的...
    99+
    2022-11-12
  • 使用Python批量压缩tif文件操作步骤
    1.前言 我在进行DEM数据的裁剪时,发现各个省的数据量非常大,比如说四川省的30m的DEM数据的大小为2G。考虑到有限的电脑磁盘空间,我对Tif文件采用了LZW压缩。 2.流程 ...
    99+
    2022-11-12
  • python 批量压缩图片的脚本
    目录简介需要 Needs用法 Usage代码实现效果另外一种图片压缩实现方式简介 用Python批量压缩图片,把文件夹或图片直接拖入即可 需要 Needs Python 3 Pillow (用pip install ...
    99+
    2022-06-02
    python 图片压缩 python 批量压缩
  • Java图片批量压缩像素的实现方法
    目录图片压缩大法压缩前大小:压缩后大小:具体代码实现:附:利用Graphics类如何进行压缩图像总结图片压缩大法 为了防止用户流量的丢失,即使在5g 即将来临的情况下,压缩算法依旧是...
    99+
    2022-11-12
  • python cv2图像质量压缩的算法示例
    使用opencv对图像进行编码,一方面是图像二进制传输的需要,另一方面对图像压缩。以jpeg压缩为例: 1、转为二进制编码 img = cv2.imread(img_path) # 取值范围:0~100,数值越小...
    99+
    2022-06-02
    python cv2 图像质量压缩 python 图像压缩 python 图片质量压缩
  • python批量压缩图片的脚本代码分享
    本篇文章和大家了解一下python批量压缩图片的脚本代码分享。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。简介用Python批量压缩图片,把文件夹或图片直接拖入即可需要 NeedsPython 3Pillow (用pip...
    99+
    2023-06-15
  • Java图片批量压缩像素的实现方法是什么
    Java图片批量压缩像素的实现方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。图片压缩大法为了防止用户流量的丢失,即使在5g 即将来临的情况下,压缩算法...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作