图片压缩python

news2024/9/20 11:23:27

在这里插入图片描述

linux粘贴文本格式错乱:
vi/vim

:set paste

然后再 insert ,粘贴

centos安装pillow图像处理库:
引用:https://blog.csdn.net/newbieLCQ/article/details/125345335

linux赋予执行权限:

# 创建文件
touch comperss.py
# 赋予权限
chmod +x compress.py

png使用pillow报错,不知道为什么,, 后面使用的pngquant。。

# 安装pngquant
brew install pngquant
# 测试图片压缩,,  quality 参数格式是min-max ,, 其中min:是最小质量值,max是最大质量值,,较低的min会更大的压缩和更低的质量,较高的max会保留更多的图像质量
pngquant --quality=10-30 --output output.png --force --verbose 222.png
import os
import subprocess
from PIL import Image, ImageFile

# 允许加载截断的图像文件
ImageFile.LOAD_TRUNCATED_IMAGES = True

def compress_image(input_path, output_path, target_size_kb, min_quality=1, max_quality=95):
    target_size_bytes = target_size_kb * 1024

    with Image.open(input_path) as img:
        img_format = img.format

        low = min_quality
        high = max_quality
        best_quality = low

        while low <= high:
            mid = (low + high) // 2
            img.save(output_path, format=img_format, quality=mid, optimize=True)
            output_size = os.path.getsize(output_path)

            if output_size <= target_size_bytes:
                best_quality = mid
                low = mid + 1
            else:
                high = mid - 1

        img.save(output_path, format=img_format, quality=best_quality, optimize=True)
        return best_quality

def compress_image_in_directory(directory, target_size_kb=50):
    for root, _, files in os.walk(directory):
        for filename in files:
            if filename.lower().endswith(('.jpg', '.jpeg', '.bmp', '.gif')):
                input_path = os.path.join(root, filename)
                output_path = os.path.join(root, f"{filename}")
                final_quality = compress_image(input_path, output_path, target_size_kb)
                print(f"{filename}_final quality is {final_quality}")
            elif filename.lower().endswith('.png'):
                input_path = os.path.join(root, filename)
                output_path = os.path.join(root, f"f_{filename}")
                final_quality = compress_image_png(input_path, output_path, target_size_kb)
                print(f"{filename}_final quality is {final_quality}")

def compress_image_png(input_path, output_path, target_size_kb=50, min_quality=1, max_quality=95):
    target_size_bytes = target_size_kb * 1024
    with Image.open(input_path) as img:
        img_format = img.format
        if img_format.lower() == 'png':
            success = compress_png_with_pngquant(input_path, output_path, target_size_kb)
            # if success:
            #     return "pngquant"
            # else:
            #     for compress_level in range(10, 0, -1):
            #         img.save(output_path, format=img_format, compress_level=compress_level)
            #         output_size = os.path.getsize(output_path)
            #         if output_size <= target_size_bytes:
            #             return compress_level
            #     img.save(output_path, format=img_format, optimize=True, compress_level=compress_level)
            #     return 1
            return "success"

def compress_png_with_pngquant(input_path, output_path, target_size_kb):
    target_size_bytes = target_size_kb * 1024
    # quality设置压缩,, 为1:压缩到最小
    command = ['pngquant', '--quality=1', '--output', output_path, '--force', '--', input_path]
    try:
        subprocess.run(command, check=True)
        output_size = os.path.getsize(output_path)
        return output_size <= target_size_bytes
    except subprocess.CalledProcessError as e:
        print(f"Error during pngquant compression: {e}")
        return False
    except FileNotFoundError as e:
        print(f"pngquant not found: {e}")
        return False

# 示例:指定目录路径
directory_path = '/Users/chenjie/code/python-learn/python410/img'  # 替换为你的图片目录路径
compress_image_in_directory(directory_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1931531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker快速安装(环境CentOS7)

1. 查看自己的Linux系统 cat /etc/redhat-release 2. 安装依赖插件 yum -y install gcc yum -y install gcc-c yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast yum -y insta…

uniapp开发钉钉小程序流程

下载开发工具 1、小程序开发工具 登录钉钉开发平台&#xff0c;根据自己的需求下载合适的版本&#xff0c;我这里下载的是Windows &#xff08;64位&#xff09;版本 小程序开发工具 - 钉钉开放平台 2、HBuilder X HBuilderX-高效极客技巧 新建项目及相关配置 新建项目 …

图示 JVM 可达性分析算法

可达性分析算法&#xff1a; 以 GC Roots 为起始点进行搜索&#xff0c;可达的对象都是存活的&#xff0c;不可达的对象可被回收。 Java 虚拟机使用该算法来判断对象是否可被回收&#xff0c;GC Roots 一般包含以下内容&#xff1a; 虚拟机栈中局部变量表中引用的对象本地方法栈…

LabVIEW机器学习实现外观检测

介绍如何利用LabVIEW平台结合机器学习技术实现对被测样品的外观检测。详细说明了硬件选择、算法使用、操作步骤以及注意事项。 硬件选择 工业相机&#xff1a;高分辨率工业相机&#xff08;如Basler、FLIR等&#xff09;用于采集样品的图像。 照明设备&#xff1a;均匀的LED照…

30.【C语言】详解printf

1.printf&#xff08;print formate&#xff09;输入函数 01.简单使用 调用前要引用头文件 #include <stdio.h> printf("abc"); 默认情况下打印完光标停留在同一行 \n可以换行 printf("abc\n"); ​ printf("ab\nc"); ​ printf(…

RocketMQ 如何保证全链路消息不丢失?

目录 1. RocketMQ 消息丢失的原因有哪些 2. 如何保证 RocketMQ 全链路消息不丢失 2.1 保证生产者发送消息到 MQ&#xff0c;消息不丢失 2.2 保证消息写入 Broker 后不丢失 2.3 保证 Broker 集群时&#xff0c;消息不丢失 2.4 保证消费者消费消息不丢失 3. 如果整个 MQ 服…

学习测试9-接口测试 3-jmeter

jmeter启动 测试计划 1 创建线程组 2 创建http请求 数据类型 from表单数据可以通过剪切板直接粘贴 JSON数据需要从括号开始复制 3 查看结果树 4 http cookie管理器&#xff0c;可以记住登录状态 内部不用设置 5 断言 系统返回的信息进行判断 系统返回“新增会议信息成功” …

SerDes系列之如何选择AC耦合电容

交流耦合电容用于隔离PCB互连时的直流分量&#xff08;Common-mode voltage&#xff09;&#xff0c;同时传递交流分量&#xff08;Voltage swing&#xff09;&#xff0c;其作用类似于一个高通滤波器。 但是&#xff0c;如果电容容值选取不当&#xff0c;使用过程中会产生信号…

Linux中的环境变量

一、基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可以链接成功&#xff…

Guava LocalCache源码分析:LocalCache的get、put、expand、refresh、remove、clear、cleanUp

Guava LocalCache源码分析&#xff1a;LocalCache的get、put、expand 前言一、get二、put三、expand 前言 上篇文章&#xff0c;详细描写了Guava LocalCache怎样如ConcurrentHashMap对缓存数据进行了分段存储。本章主要针对LocalCache重要的几个接口进行说明。 一、get CanIg…

[笔记]Fluke3563 振动分析仪

参考文档&#xff1a;Fluke 3563 Analysis Vibration Sensor system | Fluke 1.四大机械故障损伤原因 2.振动特征 福禄克做的示意图很棒&#xff1a; 不平衡对应转动轴的一倍频&#xff0c;不对中是2倍频&#xff0c;然后3~6倍频会有未紧固故障&#xff0c;更高频的位置是齿轮…

怎么压缩视频文件?简单的压缩视频方法分享

视频已成为我们日常生活中不可或缺的一部分。但随着视频质量的提高&#xff0c;文件大小也逐渐成为我们分享的阻碍。如何有效压缩视频文件&#xff0c;使其既能保持清晰&#xff0c;又能轻松分享&#xff1f;今天&#xff0c;给大家分享五种实用的视频压缩方法&#xff0c;快来…

ubuntu上模拟串口通信

前言 有时候写了一些串口相关的程序&#xff0c;需要调试的时候&#xff0c;又没有硬件&#xff0c;或者需要等其他模块完成才能一起联调。这样搭建环境费时费力&#xff0c;很多问题等到最后联调才发现就已经很晚了。 本文提供一种在ubuntu环境下模拟串口&#xff0c;直接就可…

性价比高的宠物空气净化器什么牌子好?热门养宠空气净化器分享

作为一名有6年经验的铲屎官&#xff0c;许多新手铲屎官可能听说过宠物空气净化器&#xff0c;但了解不多。实际上&#xff0c;宠物空气净化器是养猫家庭必备的小家电之一。它的大面积进风口能有效吸附空气中的浮毛和皮屑&#xff0c;专门的除臭技术可以去除猫咪带来的异味。宠物…

Python 视频水印批量添加器

功能如下可以 一、选择水印位置 二、批量添加水印 三、可添加文本或图片 # -*- 编码&#xff1a;utf-8 -*- import cv2 import os import numpy as np from moviepy.editor import VideoFileClip from concurrent.futures import ThreadPoolExecutor import tkinter as tk fro…

【深度学习】FaceChain-SuDe,免训练,AI换脸

https://arxiv.org/abs/2403.06775 FaceChain-SuDe: Building Derived Class to Inherit Category Attributes for One-shot Subject-Driven Generation 摘要 最近&#xff0c;基于主体驱动的生成技术由于其个性化文本到图像生成的能力&#xff0c;受到了广泛关注。典型的研…

PostgreSQL使用(二)

说明&#xff1a;本文介绍PostgreSQL的DML语言&#xff1b; 插入数据 -- 1.全字段插入&#xff0c;字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入&#xff0c;字段名必须写全 insert into tb_student (id, name) values (2,…

分享3个好用的启动盘u盘制作工具

对于经常需要安装维护电脑的同学&#xff0c;制作一个可启动的U盘是非常有必要的。小编今天就和大家分享三款优秀的U盘启动盘制作工具&#xff1a;Ventoy、UltraISO和Rufus。 1. Ventoy Ventoy是一款开源的启动U盘制作工具&#xff0c;它支持将ISO、WIM、IMG、VHD(x)和EFI等类…

SpringMVC 控制层框架-上

一、SpringMVC简介 1. 介绍 Spring Web MVC 是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework 中。在控制层框架经历Srust、WebWork、Strust2等诸多产品的历代更迭之后&#xff0c;目前业界普遍选择了SpringMVC 作为Java EE项目表述层开发的首…

如何通过网络快速搜寻到自己的STM32设备

目录 一、问题概述 二、解决思路 三、代码实现 1.创建任务 2.UDP广播接收 一、问题概述 以前一直用RS232串口修改设备配置信息&#xff0c;但是现场施工人员的232线太细&#xff0c;经常容易断掉&#xff0c;这次准备用网口去修改&#xff0c;遇到了一个问题&#xff0c;…