【Python】【图像处理】图片压缩方法

简介: 【Python】【图像处理】图片压缩方法

一直想找个“无损压缩”的办法。

当然这并非真的无损。

我采用了Opencv的处理图像相关的方法。

请见代码:

# -*- coding: UTF-8 -*-# 开发人员:萌狼蓝天# 博客:Https://mllt.cc# 笔记:Https://cnblogs.com/mllt# 哔哩哔哩/微信公众号:萌狼蓝天# 开发时间:2022/10/21importurllib.parseasparseimportcv2ascvfromPILimportImageimportnumpyasnpimportosdefzipJPG(img,level,outpath):
img=parse.unquote(img)
outpath=parse.unquote(outpath)
print(img)
img=img.replace("%20"," ")
outpath=outpath.replace("%20", " ")
print(img)
img=Image.open(img)  # 避免P模式图片造成异常# print(img.mode)# 转换图片模式为RGBimg=img.convert("RGB")
img=cv.cvtColor(np.asarray(img), cv.COLOR_RGB2BGR)
# 转换为np数组# [1]cv.IMREAD_COLOR:加载彩色图像,任何图像的透明度都会被忽略,它是默认标志# [0]cv.IMREAD_GRAYSCALE:以灰度模式加载图像# [-1]cv.IMREAD_UNCHANGED:加载图像,包括 alpha 通道try:
level=int(level)
except:
return"ERROR-IMG-ZIP-JPG-LEVEL"iflevel>100:
level=100iflevel<0:
level=0try:
cv.imwrite("./temp.jpg",img,[cv.IMWRITE_JPEG_QUALITY,level])
img=Image.open("temp.jpg")
img.save(outpath)
if(os.path.exists(outpath)):
returnoutpathelse:
return"ERROR-IMG-ZIP-JPG-WRITE"exceptExceptionase:
print(e)
return"ERROR-IMG-ZIP-JPG-DEAL"# 对于JPEG格式的图片,这个参数表示从0 - 100的图片质量(CV_IMWRITE_JPEG_QUALITY), 默认值是95.## 对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0 - 9.较高的值意味着更小的尺寸和更长的压缩时间而默认值是3.## 对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值为1.# 判断文件是否存在,存在则返回成功,失败则返回失败

如果要做成接口的话,可以这样

# -*- coding: UTF-8 -*-# 开发人员:萌狼蓝天# 博客:Https://mllt.cc# 笔记:Https://cnblogs.com/mllt# 哔哩哔哩/微信公众号:萌狼蓝天# 开发时间:2022/10/21importbase64importjsonfromfastapiimportFastAPI, QueryfrompydanticimportBaseModel# uvicorn main:app --reloadimportimg.PicDealapp=FastAPI()
@app.get("/img")
defhello():
return {"Hello": "World"}
@app.post('/img/zip/jpg')
asyncdefimg_zip_jpg(img,level,outpath):
result=PicDeal.zipJPG(img,level,outpath=outpath)
state="1"if(result=="ERROR-IMG-ZIP-JPG-WRITE"):
state="0"if (result=="ERROR-IMG-ZIP-JPG-DEAL"):
state="-1"if(result=="ERROR-IMG-ZIP-JPG-LEVEL"):
state="-2"return {"data":[{"state":state},{"result":result}]}
classImgs(BaseModel):
imgs= [] # type: list[str]level=""# type: stroutpath= [] # type: list[str]@app.post('/img/zip/jpg/many')
asyncdefimg_zip_jpg(Imgs:Imgs):
print(Imgs)
result=[]
foriinrange(len(Imgs.imgs)):
r=PicDeal.zipJPG(Imgs.imgs[i], Imgs.level, Imgs.outpath[i])
state="1"ifr=="ERROR-IMG-ZIP-JPG-WRITE":
state="0"ifr=="ERROR-IMG-ZIP-JPG-DEAL":
state="-1"ifr=="ERROR-IMG-ZIP-JPG-LEVEL":
state="-2"result.append({"state": state, "result": r})
return {"data":{"result":result}}

下面是我做的。

0fd56951edce99be9230f26486656fda_2571021-20230225213626824-1904624093.png

9efbd1b6b36129fa853936ae3baf6a21_2571021-20230225213732575-1746230424.png

77d272b6a6406bd1b7c97850a94d6c28_2571021-20230225213847577-993381620.png

手机拍的照片,1.84MB压缩成468kb(默认75)情况下

手机拍的照片,2.56MB压缩成532kb(默认50)情况下

相关文章
|
9天前
|
移动开发 Python Windows
python编程获取网页标题title的几种方法及效果对比(源代码)
python编程获取网页标题title的几种方法及效果对比(源代码)
|
1天前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
27 16
|
8天前
|
Python
python方法,传参20220101 计算与当前时间差
python方法,传参20220101 计算与当前时间差
|
9天前
|
缓存 开发者 Python
Python指定行号读取文件的方法
这种方法的优势在于它的效率和简便性,特别是当需要从同一文件中读取多行时。`linecache`会缓存文件,减少了重复读取的开销。
15 4
|
8天前
|
存储 Python
Python中类方法、实例方法与静态方法的区别
这三种方法的正确使用可以使代码更加清晰、组织良好并且易于理解,从而有效地支持软件开发的面向对象编程范式。
10 1
|
7天前
|
机器学习/深度学习 PyTorch TensorFlow
Python实现深度学习学习率指数衰减的方法与参数介绍
学习率指数衰减提供了一种高效的动态调整学习率的手段,帮助模型在不同训练阶段以不同的学习速度优化,有利于提升模型性能和训练效率。通过合理设置衰减策略中的参数,可以有效地控制学习率的衰减过程,实现更加精确的模型训练调优。
10 0
|
7天前
|
UED Python
Python requests库下载文件时展示进度条的实现方法
以上就是使用Python `requests`库下载文件时展示进度条的一种实现方法,它不仅简洁易懂,而且在实际应用中非常实用。
20 0
|
9天前
|
JSON JavaScript 前端开发
6-19|Python数据传到JS的方法
6-19|Python数据传到JS的方法
|
9天前
|
大数据 Python
6-11|Python中保证两位小数的方法
6-11|Python中保证两位小数的方法
|
9天前
|
Python
Python类中属性和方法区分3-8
Python类中属性和方法区分3-8
下一篇
无影云桌面