首页 > 编程语言 >Python 压缩图片至指定大小

Python 压缩图片至指定大小

时间:2023-09-18 14:22:56浏览次数:41  
标签:Python 压缩 指定 param outfile im out size

@https://www.cnblogs.com/jum-bolg/p/13796595.html

import base64
import io
import os
from PIL import Image
from PIL import ImageFile


# 压缩图片文件
def compress_image(outfile, mb=600, quality=85, k=0.9):
    """不改变图片尺寸压缩到指定大小
    :param outfile: 压缩文件保存地址
    :param mb: 压缩目标,KB
    :param step: 每次调整的压缩比率
    :param quality: 初始压缩比率
    :return: 压缩文件地址,压缩文件大小
    """

    o_size = os.path.getsize(outfile) // 1024
    print(o_size, mb)
    if o_size <= mb:
        return outfile

    ImageFile.LOAD_TRUNCATED_IMAGES = True
    while o_size > mb:
        im = Image.open(outfile)
        x, y = im.size
        out = im.resize((int(x * k), int(y * k)), Image.ANTIALIAS)
        try:
            out.save(outfile, quality=quality)
        except Exception as e:
            print(e)
            break
        o_size = os.path.getsize(outfile) // 1024
    return outfile

    # 压缩base64的图片


def compress_image_bs4(b64, mb=190, k=0.9):
    """不改变图片尺寸压缩到指定大小
    :param outfile: 压缩文件保存地址
    :param mb: 压缩目标,KB
    :param step: 每次调整的压缩比率
    :param quality: 初始压缩比率
    :return: 压缩文件地址,压缩文件大小
    """
    f = base64.b64decode(b64)
    with io.BytesIO(f) as im:
        o_size = len(im.getvalue()) // 1024
        if o_size <= mb:
            return b64
        im_out = im
        while o_size > mb:
            img = Image.open(im_out)
            x, y = img.size
            out = img.resize((int(x * k), int(y * k)), Image.ANTIALIAS)
            im_out.close()
            im_out = io.BytesIO()
            out.save(im_out, 'jpeg')
            o_size = len(im_out.getvalue()) // 1024
        b64 = base64.b64encode(im_out.getvalue())
        im_out.close()
        return str(b64, encoding='utf8')


if __name__ == "__main__":
    for img in os.listdir('./out_img'):
        compress_image(outfile='./out_img/' + str(img)[0:-4] + '.png')
    print('完')

标签:Python,压缩,指定,param,outfile,im,out,size
From: https://www.cnblogs.com/bitterteaer/p/17711763.html

相关文章

  • vs打开项目出现“尚未配置为Web项目XXXX指定的本地IIS URL HTTP://localhost:…… .要
    用把工程文件(.vcxproj文件打开找到如下代码片段 ,请将下面片段代码中的(最好用notepad++打开)<UseIIS>True</UseIIS>、<AutoAssignPort>True</AutoAssignPort>节点的值改为False<WebProjectProperties><UseIIS>True</UseIIS><AutoAssignPor......
  • windows批量删除指定前缀key
    直接上代码:del_keys_by_prefix.bat@echooffecho调用格式:[redis地址][redis密码][redis库号][待删除的key前缀带*]setkeysfile=redis-cached-keys.txtredis-cli-h%1-a%2-n%3keys%4>%keysfile%FOR/F%%iin(%keysfile%)DO(redis-cli-h%1-a%2-n%3de......
  • Python在Linux上执行脚本
    Linux命令行运行Python脚本1.安装Python解释器查看Python解释器安装位置:whichpython2.创建Python脚本这里说下在linux中命令行创建Python脚本##nano命令创建hello.py,里面写一个print("Hello,World!")nanohello.py更多场景是你写个python文件,上传服务器,......
  • 184_Python 在 Excel 和 Power BI 绘制堆积瀑布图
    184_Python在Excel和PowerBI绘制堆积瀑布图一、背景在2023年8月22日微软Excel官方宣布:在Excel原生内置的支持了Python。博客原文笔者第一时间就更新到了Excel的预览版,通过了漫长等待分发,现在可以体验了,先来看看效果。在Excel公式选项卡下Python菜单......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-16-处理模态对话框弹窗
    1.简介我们在日常工作中,会经常遇到弹出警告框的问题,弹框无法绕过,必须处理才可以执行后续的测试,所以弹框处理也是我们必须掌握的一个知识。宏哥在java+selenium系列文章中介绍过这部分内容。那么,playwright对于弹框的处理是怎样的?是否比selenium更加简单呢?下面我们就来介绍一下pla......
  • Python爬虫自动切换爬虫ip的完美方案
    在进行网络爬虫时,经常会遇到需要切换爬虫ip的情况,以绕过限制或保护自己的爬虫请求。今天,我将为你介绍Python爬虫中自动切换爬虫ip的终极方案,让你的爬虫更加高效稳定。步骤一:准备爬虫ip池首先,你需要准备一个可靠的爬虫ip池。爬虫ip池是由多个爬虫ip组成的集合,可以通过API或爬虫获取......
  • Python基础教程08 - 面向对象的基本概念
    Python使用类(class)和对象(object),进行面向对象(object-orientedprogramming,简称OOP)的编程。面向对象的最主要目的是提高程序的重复使用性。我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的。了解OOP是进一步学习Python的关键。下面是对面向对象的一种理解,基于分......
  • 用python求100到999以内的水仙花数(不用除法求各项)
    c=0forainrange(100,1000):forbinstr(a):a1=int(b)c=c+a1**3ifa==c:print(a)c=0输出结果为153370371407使用for循环来取数字中的每一位,不过数字要先化为str格式来取然后再化为int格式来赋值,要注意c的值每一次......
  • python第一个程序
    input(name)   注意input读取的值,都是str字符串数据类型转换数据类型(需要转换的变量名) 格式化打印在字符串前面加f可以告诉解释器这个字符串里引用了变量{}里面写引用的变量名流程控制单分支fi条件:当条件为true时,执行子代码双分支fi条件:当条件......
  • python闭包
    python中的闭包1、什么是闭包2、闭包的作用域问题3、闭包的应用场景1、什么是闭包闭包指的是闭包函数,与函数嵌套的区别在于闭包函数(内层函数)会使用到外层函数的变量。构成闭包的几个条件1、一个函数必须有一个内层函数;2、内层函数必须使用到外层函数的变量;3、外层函数......