【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)情况下

目录
打赏
0
0
0
0
19
分享
相关文章
Python数值方法在工程和科学问题解决中的应用
本文探讨了Python数值方法在工程和科学领域的广泛应用。首先介绍了数值计算的基本概念及Python的优势,如易学易用、丰富的库支持和跨平台性。接着分析了Python在有限元分析、信号处理、优化问题求解和控制系统设计等工程问题中的应用,以及在数据分析、机器学习、模拟建模和深度学习等科学问题中的实践。通过具体案例,展示了Python解决实际问题的能力,最后总结展望了Python在未来工程和科学研究中的发展潜力。
|
2月前
|
Python技术解析:了解数字类型及数据类型转换的方法。
在Python的世界里,数字并不只是简单的数学符号,他们更多的是一种生动有趣的语言,用来表达我们的思维和创意。希望你从这个小小的讲解中学到了有趣的内容,用Python的魔法揭示数字的奥秘。
81 26
|
2月前
|
在VScode环境下配置Python环境的方法
经过上述步骤,你的VSCode环境就已经配置好了。请尽情享受这扇你为自己开启的知识之窗。如同你在冒险世界中前行,你的探索之路只有越走越广,你获得的知识只会越来越丰富,你的能力只会越来越强。
189 37
解决Python requests库POST请求参数顺序问题的方法。
总之,想要在Python的requests库里保持POST参数顺序,你要像捋顺头发一样捋顺它们,在向服务器炫耀你那有条不紊的数据前。抓紧手中的 `OrderedDict`与 `json`这两把钥匙,就能向服务端展示你的请求参数就像经过高端配置的快递包裹,里面的商品摆放井井有条,任何时候开箱都是一种享受。
55 10
Python 图像处理技巧
本文介绍了Python图像处理中需要掌握的15个基本技能,涵盖图像读取与保存、颜色空间转换、裁剪与调整大小、滤波与平滑、边缘检测、阈值处理、形态学操作、直方图处理、特征检测与描述、图像配准与特征匹配、轮廓检测与分析、图像分割、模板匹配、透视变换与仿射变换以及傅里叶变换等内容。通过OpenCV、Pillow和Matplotlib等库实现相关功能,为图像处理提供了全面的基础指导。
|
2月前
|
Python 中__new__方法详解及使用
__new__ 是 Python 中用于创建类实例的静态方法,在实例化对象时优先于 __init__ 执行。它定义在基础类 object 中,需传递 cls 参数(表示当前类)。__new__ 可决定是否使用 __init__ 方法或返回其他对象作为实例。特性包括:1) 在实例化前调用;2) 始终为静态方法。示例中展示了其用法及 Python2 和 Python3 的差异,强调了参数处理的不同。
101 10
python__init__方法笔记
本文总结了Python中`__init__`方法的使用要点,包括子类对父类构造方法的调用规则。当子类未重写`__init__`时,实例化会自动调用父类的构造方法;若重写,则需通过`super()`或直接调用父类名称来显式继承父类初始化逻辑。文中通过具体代码示例展示了不同场景下的行为及输出结果,帮助理解类属性与成员变量的关系,以及如何正确使用`super()`实现构造方法的继承。
102 9
[oeasy]python093_find方法_指数为负数_index_实际效果
本文介绍了Python中`find`方法与索引(index)的使用,包括负数索引的实际效果。回顾了`eval`函数的应用,并强调类名如`str`、`int`、`list`不可用作变量名以避免覆盖。通过示例解析了负数索引在字符串和列表中的作用,以及`index`方法的三个参数(value、start、stop)的用法。同时对比了`index`和`find`方法的区别:`index`找不到子串时抛出`ValueError`,而`find`返回-1。最后总结了正负索引的使用场景及两者的特性,提供了相关学习资源链接。
308 8
|
3月前
|
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
169 15
uv安装python及其依赖的加速方法
国内在使用uv的时候,可能会涉及到装python的速度太慢的问题,为了解决这个问题,可以使用`UV_PYTHON_INSTALL_MIRROR`这个环境变量。除此以外,对于多人协作场景,`UV_CACHE_DIR`也是一个有用的环境变量。本文会介绍这两个变量。
1974 10

推荐镜像

更多
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等