python压缩图片--指定压缩大小且保真压缩

这篇具有很好参考价值的文章主要介绍了python压缩图片--指定压缩大小且保真压缩。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码核心思路

  • 循环降低图片质量quality
  • 直至图片质量大小符合目标质量后退出循环

pillow压缩失真严重

'''
pip install pillow
'''
from io import BytesIO

from PIL import Image


def pic_compress(pic_path, out_path, target_size, quality=90, step=5):
    # 读取图片bytes
    with open(pic_path, 'rb') as f:
        pic_byte = f.read()

    current_size = len(pic_byte) / 1024  # 图片当前质量大小
    print("图片压缩前的大小为(KB):", current_size)
    while current_size > target_size:  # 当达到目标压缩大小后退出循环
        img = Image.open(BytesIO(pic_byte))
        buf = BytesIO()
        img.save(buf, format=img.format, quality=quality)
        pic_byte = buf.getvalue()
        if quality - step < 0:  # 以降低到最小质量
            break
        quality -= step
        current_size = len(pic_byte) / 1024

    # 保存图片
    with open(out_path, 'wb') as f:
        f.write(pic_byte)

    return len(pic_byte) / 1024


def main():
    pic_size = pic_compress('test.jpg', 'new_test.jpg', target_size=100)
    print("图片压缩后的大小为(KB):", pic_size)

if __name__ == '__main__':
    main()

pillow处理后和原图片的对比
python压缩图片--指定压缩大小且保真压缩

使用pillow压缩的图片不单止大小质量没达标而且处理后的图片失真不忍直视。

使用opencv保真压缩

'''
pip install numpy
pip install opencv-python
'''
from io import BytesIO

import cv2
import numpy as np


def pic_compress(pic_path, out_path, target_size=199, quality=90, step=5, pic_type='.jpg'):
    # 读取图片bytes
    with open(pic_path, 'rb') as f:
        pic_byte = f.read()

    img_np = np.frombuffer(pic_byte, np.uint8)
    img_cv = cv2.imdecode(img_np, cv2.IMREAD_ANYCOLOR)

    current_size = len(pic_byte) / 1024
    print("图片压缩前的大小为(KB):", current_size)
    while current_size > target_size:
        pic_byte = cv2.imencode(pic_type, img_cv, [int(cv2.IMWRITE_JPEG_QUALITY), quality])[1]
        if quality - step < 0:
            break
        quality -= step
        current_size = len(pic_byte) / 1024

    # 保存图片
    with open(out_path, 'wb') as f:
        f.write(BytesIO(pic_byte).getvalue())

    return len(pic_byte) / 1024


def main():
    pic_size = pic_compress('test.jpg', 'new_test.jpg', target_size=100)
    print("图片压缩后的大小为(KB):", pic_size)


if __name__ == '__main__':
    main()

opencv处理后和原图片的对比
python压缩图片--指定压缩大小且保真压缩文章来源地址https://www.toymoban.com/news/detail-503114.html

文章灵感

  • 想用python压缩图片然后网上搜,搜索结果90%都是python使用pillow的压缩。最主要是pillow压缩后失真严重,在图片压缩方面纯属是个摆设的功能。

到了这里,关于python压缩图片--指定压缩大小且保真压缩的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jpg图片怎么压缩大小,3个有效工具分享

           jpg图片怎么压缩大小?很多小伙伴都会用电脑来保存平时拍摄在的照片吧,拍摄的照片大多是jpg格式的,如果图片的体积太大,那么可能会占用很多的电脑存储空间,最后的结果是电脑变得非常慢,甚至卡死。平时我们在工作中也不太喜欢使用体积偏大的jpg图片,为

    2024年02月02日
    浏览(43)
  • 如何将jpg图片大小压缩?这个方法建议收藏

    如何将jpg图片大小压缩?平时在分享jpg图片的时候,如果遇到图片过大无法使用的情况,可以试试本文分享的这个方法,通过图片在线处理工具压缩jpg文件大小,还不会操作的小伙伴也不用担心,下面小编会详细介绍jpg压缩的操作步骤,赶紧学习起来吧。 用浏览器打开压缩图

    2024年01月21日
    浏览(35)
  • 【vue3】前端上传图片的格式大小限制和压缩

    目录 前言 对上传图片进行格式大小限制 压缩上传图片 上篇文章中研究了如何使用双token机制,在此篇中就暴露了一些问题:当accesstoken过期后,直到拿到最终想要得到的数据,期间需要经历三次请求——第一次请求,拿到accesstoken过期的消息——第二次携带refreshtoken发起请求

    2024年02月06日
    浏览(54)
  • Qt QPixmap QImage 图片等比例缩放到指定大小

    改变窗口组件的情况下改变窗口背景图片的大小,QImage、QPixmap等绘图设备类都提供scaled()函数。  scaled函数: scaled(const QSize size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const   第一个参数代表缩放后的尺寸   第二个

    2024年01月25日
    浏览(33)
  • 将图片的大小(分辨率)调整为指定的宽度和高度

    这段代码将图像文件\\\"original.jpg\\\"的大小调整为宽度300像素,高度200像素,并将调整后的图像保存为\\\"resized.jpg\\\"。您可以根据需要修改输入和输出的文件路径和名称。 1. 方法一 2. 方法二

    2024年02月08日
    浏览(41)
  • Matlab 保存指定像素大小的图片, 为什么保存图的实际大小与设置的不一致?

     matlab使用getframe函数保存指定像素大小的图片。 使用 set(gcf, \\\'position\\\', [124,124,800,800]);设置图片位置和大小,可将图片保存为256x256大小。 (代码第3行) 仅把\\\'position\\\'参数从124改成125时,不能保存为期望的256x256大小,反而是320x320大小,这是为什么??(代码第4行) 试试其他几

    2024年02月12日
    浏览(34)
  • c# .net linux ImageSharp+FastDFS+Base64上传图片,压缩图片大小,图像处理dcoker中使用也可以

    .net 以前是用System.Drawing来处理图片,但是在dcoker 、linux上用不了 微软官方推荐用 1、SkiaSharp 如果项目运行到docker里,需要NUGET安装SkiaSharp.NativeAssets.Linux.NoDependencies 注意:如果你同时引用SkiaSharp.NativeAssets.Linux和SkiaSharp.NativeAssets.Linux.NoDependencies 可能会导致docker中运行报错,

    2024年02月07日
    浏览(36)
  • python压缩pdf文件大小

    pdf文件过大,经常会是一个问题,但是市面上基本上都是收费的工具,wps需要开会员才能使用。因此找了一个python库进行试验: 首先需要安装 运行的代码: 这个代码使用非常简单,主要是压缩文件里面的图片质量,实际上图片质量差一些在阅读器里面是看不出来的区别,效

    2024年02月13日
    浏览(27)
  • 【代码管理】Git删除仓库中的大文件压缩仓库大小

    Git 仓库中有时会不小心加入了一些大文件,例如模型文件,视频文件 模型文件有可能以 .weights 结尾,或者 .onnx 结尾等等 视频文件有可能以 .avi 结尾,或者 .mp4 结尾 大文件如果一直在仓库中,仓库体积会非常大,下面我们提供一个脚本,专门用于清理 仓库中的文件使用。

    2024年04月26日
    浏览(27)
  • Python生成指定大小的文件

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/400bd75c.html 你好,我是测试蔡坨坨。 在日常测试工作中,我们经常需要对上传的文件大小进行测试,例如:一个文件上传功能,限制文件大小最大为10MB,此时我们可能需要测试10MB以及其边界值9MB和11MB;再或者我们

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包