当前位置:   article > 正文

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

python压缩图片大小


欢迎关注 『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("图片保存成功")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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("图片保存成功")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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("图片保存成功")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

总结

大家喜欢的话,给个

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/671665
推荐阅读
相关标签