我的编程空间,编程开发者的网络收藏夹
学习永远不晚

教你用Python压缩图片

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

教你用Python压缩图片

质量、速度、廉价,选择其中两个

如果需要做图片识别那么必定需要大量的训练素材,我们通常使用爬虫来获取,python爬取bing图片,python爬取百度图片,但是怕取下来的图片大小不一,再进行训练之前必须进行裁剪和压缩,今天就来讲一讲图片压缩,下面这个例子是我做一个项目时用到的


import PIL.Image as Image
import os

#图片压缩批处理
def compressImage(class="lazy" data-srcPath,dstPath):
    for filename in os.listdir(class="lazy" data-srcPath):
        #如果不存在目的目录则创建一个,保持层级结构
        if not os.path.exists(dstPath):
                os.makedirs(dstPath)

        #拼接完整的文件或文件夹路径
        class="lazy" data-srcFile=os.path.join(class="lazy" data-srcPath,filename)
        dstFile=os.path.join(dstPath,filename)

        # 如果是文件就处理
        if os.path.isfile(class="lazy" data-srcFile):
            try:
                #打开原图片缩小后保存,可以用if class="lazy" data-srcFile.endswith(".jpg")或者split,splitext等函数等针对特定文件压缩
                sImg=Image.open(class="lazy" data-srcFile)
                w,h=sImg.size
                dImg=sImg.resize((int(w/2),int(h/2)),Image.ANTIALIAS)  #设置压缩尺寸和选项,注意尺寸要用括号
                dImg.save(dstFile) #也可以用class="lazy" data-srcFile原路径保存,或者更改后缀保存,save这个函数后面可以加压缩编码选项JPEG之类的
                print (dstFile+" 成功!")
            except Exception:
                print(dstFile+"失败!!!!!!!!!!!!!!!!!!!!!!!!!!!!")

        # 如果是文件夹就递归
        if os.path.isdir(class="lazy" data-srcFile):
            compressImage(class="lazy" data-srcFile, dstFile)

if __name__=='__main__':
    compressImage("G:/兔屎图片_未处理","G:/兔屎图片_已处理")

可能这个方法不是很通用,因为我当时处理的图片都是很大的,一个图片大概在3M-5M这样,而我并不需要这么高分辨率,因为太高分辨率会影响我机器学习的效率,我就采用最粗暴的方法,使用PIL库中的Image类,调用resize方法把图片的宽高直接砍一半,但是这里我还是采用了Image.ANTIALIAS滤镜虽然这样会使我图片压缩的效率降低一大截,但也尽最大可能的保留了图片的信息。

但我后来又遇到一种更好的压缩图片的方法,使用tinify API进行压缩,通过它压缩的图片信息基本上没有损失,是个压缩图片利它的官方网站:https://tinypng.com/

在它官网上也可以直接进行压缩,不过只能小批量的操作,一次最多20张,下面是使用它进行图片压缩的脚本,你需要自己申请Key填写到程序中


import os
import os.path
import click
import tinify

tinify.key = "你申请的Key,放在这里."
targetFileDirName = "/compress" #输出目录
targetIsDir = False
totalPicCount = 1 #压缩图片总数
compressSuccessPicCount = 0 #图片压缩成功的数量

#这里就是通过tingPng压缩图片的核心代码
def compress_core(file, outputFile):
    source = tinify.from_file(file)  #压缩指定文件
    source.to_file(outputFile)       #将压缩后的文件输出当指定位置

def compress_file(file):
    if not os.path.isfile(file):
        print("你指定的不是文件,不给你压缩这个文件!")
        return
    class="lazy" data-srcFiledirName = os.path.dirname(file)
    basename = os.path.basename(file)  #获得文件全称 例如  migo.png
    filename, fileSuffix = os.path.splitext(basename)  #获得文件名称和后缀名  例如 migo 和 png
    if picIsCorrect(fileSuffix):
        targetFileDir = class="lazy" data-srcFiledirName + targetFileDirName
        if not os.path.isdir(targetFileDir):
            os.mkdir(targetFileDir)
        print("正在压缩的图片:  %s"%(class="lazy" data-srcFiledirName + "/" +basename))
        compress_core(file, targetFileDir + "/" + basename)
        global compressSuccessPicCount
        compressSuccessPicCount += 1
        global targetIsDir
        if targetIsDir is not True:
            print("------------压缩的图片在:  %s  目录下"%(targetFileDir))
    else:
        print("暂不支持压缩 {} 格式的文件, 文件名: {}".format(fileSuffix, basename))

def picIsCorrect(fileSuffix):
    if fileSuffix == ".png" or fileSuffix == ".jpg" or fileSuffix == ".jpeg":
        return True
    else:
        return False

def compress_dir(dir):
    if not os.path.isdir(dir):
        print("你输入的不是一个目录")
        return
    else:
        global targetIsDir
        targetIsDir = True
        class="lazy" data-srcFilePath = dir #源路径
        for root, dirs, files in os.walk(class="lazy" data-srcFilePath):
            global totalPicCount
            totalPicCount = len(files)
            for name in files:
                compress_file(class="lazy" data-srcFilePath + "/" + name)
            break #仅遍历当前目录
    print("------------所有压缩的图片都在: %s  目录下" %(class="lazy" data-srcFilePath + targetFileDirName))

@click.command()
@click.option('-f', "--file",  type=str,  default=None,  help="单个文件压缩")
@click.option('-d', "--dir",   type=str,  default=None,  help="被压缩的文件夹")
def run(file, dir):
    if not file is None:
        compress_file(file)         #压缩指定的文件
        pass
    elif not dir is None:
        compress_dir(dir)           #压缩指定的目录
        pass
    else:
        compress_dir(os.getcwd())   #压缩当前文件夹
        print("当前目录: %s"%(os.getcwd()))
    print("------压缩结束!------图片总数 ({}),  压缩的图片数量 ({})".format(totalPicCount, compressSuccessPicCount))

if __name__ == "__main__":
    run()

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

教你用Python压缩图片

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

下载Word文档

猜你喜欢

教你用Python压缩图片

质量、速度、廉价,选择其中两个如果需要做图片识别那么必定需要大量的训练素材,我们通常使用爬虫来获取,python爬取bing图片,python爬取百度图片,但是怕取下来的图片大小不一,再进行训练之前必须进行裁剪和压缩,今天就来讲一讲图片压缩
2023-01-31

python利用Guetzli批量压缩图片

Google 又开源了,这次开源了一款图像算法工具 Guetzli。Guetzli,在瑞士德语中是“cookie(曲奇)”的意思,是一个针对数码图像和网页图像的 JPEG 编码器,能够通过产生更小的 JPEG 文件来达到更快的在线体验,并且
2022-06-04

Android图片压缩(质量压缩和尺寸压缩)

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可
2023-05-31

如何使用Python实现图片压缩

小编给大家分享一下如何使用Python实现图片压缩,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、引言我们先来看一下,自拍照原图。图片大小是 53KB接下来,就
2023-06-26

python 批量压缩图片的脚本

目录简介需要 Needs用法 Usage代码实现效果另外一种图片压缩实现方式简介 用Python批量压缩图片,把文件夹或图片直接拖入即可 需要 Needs Python 3 Pillow (用pip install pillow来安装即可)
2022-06-02

怎么使用canvas压缩图片

今天就跟大家聊聊有关怎么使用canvas压缩图片,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.首先要先获取到图片文件var eleFile = document.querySel
2023-06-09

python中学习K-Means和图片压缩

大家在学习python中,经常会使用到K-Means和图片压缩的,我们在此给大家分享一下K-Means和图片压缩的方法和原理,喜欢的朋友收藏一下吧。通俗的介绍这种压缩方式,就是将原来很多的颜色用少量的颜色去表示,这样就可以减小图片大小了。下
2022-06-04

python怎么实现图片批量压缩

这篇文章主要介绍python怎么实现图片批量压缩,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(
2023-06-14

Python简易图片批量压缩程序

说明运行环境:Win10 Pycharm程序没有用到面向对象编程方法,只是简单的面向过程设计用到的模块:PIL、os、sys使用方法: 在Pycharm的terminal中输入”python xxx.py source_dir dest_d
2023-01-31

Android获取照片、裁剪图片、压缩图片

前言在做上一个项目时深深受到了图片上传的苦恼。图片上传主要分为两个部分,首先要获取图片,而获取图片可以分为从文件获取或者拍照获取。第二个部分才是上传图片,两个部分都是走了不少弯路。由于Android系统的碎片化比较严重,我们可能出现在第一台
2023-05-31

怎么使用python对图片进行批量压缩

本篇内容主要讲解“怎么使用python对图片进行批量压缩”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用python对图片进行批量压缩”吧!使用Python和Pillow模块压缩图片Pil
2023-07-02

Android实现图片压缩(bitmap的六种压缩方式)

Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式:其中,A代表透明
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录