当前位置: 首页 > news >正文

【Python黑科技】图片太大不能上传?三种压缩图片大小的方法(代码注释详细)

目录

    • 实现效果
      • 原图大小8.46MB
      • PIL库quality降低图片质量方式压缩图片366KB
      • PIL库thumbnail压缩图片大小来压缩图片985KB
      • OpenCV缩放图片大小来压缩图片 177KB
    • 图片素材和源码
    • 实现思路
    • 实现代码
      • PIL库quality降低图片质量方式压缩图片
      • PIL库thumbnail压缩图片大小来压缩图片
      • OpenCV缩放图片大小来压缩图片
    • 总结


欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中

实现效果

下面的各种压缩大小效果受压缩图片长宽大小和图片质量高低影响,可进一步微调。

原图大小8.46MB

在这里插入图片描述

PIL库quality降低图片质量方式压缩图片366KB

在这里插入图片描述

PIL库thumbnail压缩图片大小来压缩图片985KB

在这里插入图片描述

OpenCV缩放图片大小来压缩图片 177KB

在这里插入图片描述


图片素材和源码

已经上传至我的gitee仓库
python黑科技
在这里插入图片描述


实现思路

首先我们要知道一点,所有的压缩技术必然有失真,就像经典难题时空效率的冲突一样,图片占用空间大小压缩的代价要么是图片质量降低,要么是图片长宽大小减小。

我们这里提供了三种方法:

  • PIL库quality降低图片质量方式压缩图片
  • PIL库thumbnail压缩图片大小来压缩图片
  • OpenCV缩放图片大小来压缩图片

实现代码

PIL库quality降低图片质量方式压缩图片

import time
from PIL import Image,ImageFile

#防止图片超过178956970 pixels 而报错
ImageFile.LOAD_TRUNCATED_IMAGES = True
Image.MAX_IMAGE_PIXELS = None

#读取img文件
#imgName='bigPhoto.jpg'
imgName=input("请输入图片名称:\n")
orgin_photo = Image.open(imgName)#读取img文件

timeNow=time.strftime("%Y-%m-%d-%H-%M-%S-",time.localtime(int(time.time())))#获取当前时间
print(timeNow+imgName)#生成图片的名字
orgin_photo.save("quality-"+timeNow+imgName,quality = 30)#quality 是设置压缩比,可以理解为图片质量,quality越大质量越好
print("图片保存成功")

PIL库thumbnail压缩图片大小来压缩图片

import time

from PIL import Image,ImageFile

#防止图片超过178956970 pixels 而报错,小图片没关系
ImageFile.LOAD_TRUNCATED_IMAGES = True
Image.MAX_IMAGE_PIXELS = None

#imgName='bigPhoto.jpg'
imgName=input("请输入图片名称:\n")
orgin_photo = Image.open(imgName)#读取img文件

w,h = orgin_photo.size#获取原尺寸图片大小

orgin_photo.thumbnail  = ((w // 5, h // 5))#图片进行20%的压缩


timeNow=time.strftime("%Y-%m-%d-%H-%M-%S-",time.localtime(int(time.time())))#获取当前时间
print(timeNow+imgName)#生成图片的名字
orgin_photo.save("thumbnail-"+timeNow+imgName)#重写图片并保存
print("图片保存成功")

OpenCV缩放图片大小来压缩图片

from cv2 import cv2
import  time

# imgName='bigPhoto.jpg'
imgName=input("请输入图片名称:\n")
imgs = cv2.imread(imgName)

#图片缩放至原图的1/4,最邻近插值
resize_img = cv2.resize(imgs, (0, 0), fx=0.20, fy=0.20, interpolation=cv2.INTER_NEAREST)
#resize(InputArray src, OutputArray dst, Size dsize,double fx=0, double fy=0, int interpolation=INTER_LINEAR )
# InputArray src :输入,原图像,即待改变大小的图像;
# OutputArray dst: 输出,改变后的图像。这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;
# dsize:输出图像的大小,如上面例子(300,300)。
# fx和fy是图像width方向和height方向的缩放比例。
# fx:width方向的缩放比例,fy:height方向的缩放比例
# interpolation(插值):这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:
# INTER_NEAREST - 最邻近插值
# INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
# INTER_CUBIC - 4x4像素邻域内的双立方插值
# INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

#重写图片并保存
timeNow=time.strftime("%Y-%m-%d-%H-%M-%S-",time.localtime(int(time.time())))#获取当前时间
print(timeNow+imgName)#生成图片的名字
cv2.imwrite("cv2-"+timeNow+imgName, resize_img)
print("图片保存成功")

总结

大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的Python黑科技!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2022 mzh

Crated:2022-2-1

欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中
【Python黑科技】tkinter库实战7个小项目合集(保姆级图文+实现代码)
【Python黑科技】tkinter库实战制作一个计算器(保姆级图文+实现代码)
【Python黑科技】tkinter库实战制作一个记事本(保姆级图文+实现代码)
【Python黑科技】tkinter库实战用户的注册和登录(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“2048”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“俄罗斯方块”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“贪吃蛇”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“连连看”小游戏(保姆级图文+实现代码)

【Python安装第三方库一行命令永久提高速度】
【使用PyInstaller打包exe】
【免登陆爬虫一键下载知乎文章图片(保姆级图文+实现代码)】
【孤独的程序员和AI机器人朋友聊天解闷(免费接口+保姆级图文+实现代码注释)】
【几行代码绘制gif动图(保姆级图文+实现代码)】
【几行代码实现网课定时循环截屏,保存重要知识点(保姆级图文+实现代码)】
【常用的user_agent 浏览器头爬虫模拟用户(保姆级图文+实现代码)】
【更多内容敬请期待】


相关文章:

  • hadoop生态圈面试精华之Yarn
  • 阿里云:加大NoSQL数据库软硬件一体化技术自研
  • 机构用户注册/登录的设计
  • 面向对象-多态
  • C语言高级教程-C语言数组(二)
  • 【JS】JavaScript入门笔记第三弹~
  • 关于写文章怎样才能制作出优质封面?看完这篇博客就够了(数千字手把手教学)
  • nodejs 模块
  • lLinux环境变量
  • 基于SD卡的嵌入式Linux系统镜像制作
  • 手把手教你用Yolov5 (v6.2) 训练分类模型 基于《Kaggle猫狗大战》案例
  • PostgreSQL数据库统计信息——analyze执行函数
  • ping不通Linux服务器怎么办?
  • 【数据结构初阶-二叉树】非线性数据结构来了
  • 牛客网《剑指offer》专栏刷题练习之数组专精
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • EOS是什么
  • ES6 学习笔记(一)let,const和解构赋值
  • gf框架之分页模块(五) - 自定义分页
  • Git学习与使用心得(1)—— 初始化
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • k个最大的数及变种小结
  • Laravel 中的一个后期静态绑定
  • learning koa2.x
  • NSTimer学习笔记
  • PHP面试之三:MySQL数据库
  • React-生命周期杂记
  • Spring Boot快速入门(一):Hello Spring Boot
  • STAR法则
  • Vue.js源码(2):初探List Rendering
  • Vue小说阅读器(仿追书神器)
  • 安装python包到指定虚拟环境
  • 服务器从安装到部署全过程(二)
  • 跳前端坑前,先看看这个!!
  • 微信小程序填坑清单
  • 一个JAVA程序员成长之路分享
  • 由插件封装引出的一丢丢思考
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #FPGA(基础知识)
  • #前后端分离# 头条发布系统
  • (2022 CVPR) Unbiased Teacher v2
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (二)学习JVM —— 垃圾回收机制
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)socket Aio demo
  • *2 echo、printf、mkdir命令的应用
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net framework4与其client profile版本的区别
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献