【Python】【图像处理】图片压缩方法
一直想找个“无损压缩”的办法。
当然这并非真的无损。
我采用了Opencv的处理图像相关的方法。
请见代码:
注意:
opencv安装:pip install opencv-python 或者 conda install opencv
别想不开 install cv2 ……
点击查看代码
# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/10/21
import urllib.parse as parse
import cv2 as cv
from PIL import Image
import numpy as np
import os
def zipJPG(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)
# 转换图片模式为RGB
img = 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"
if level>100:
level=100
if level<0:
level=0
try:
cv.imwrite("./temp.jpg",img,[cv.IMWRITE_JPEG_QUALITY,level])
img = Image.open("temp.jpg")
img.save(outpath)
if(os.path.exists(outpath)):
return outpath
else:
return "ERROR-IMG-ZIP-JPG-WRITE"
except Exception as e:
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/21
import base64
import json
from fastapi import FastAPI, Query
from pydantic import BaseModel
# uvicorn main:app --reload
import img.PicDeal
app = FastAPI()
@app.get("/img")
def hello():
return {"Hello": "World"}
@app.post('/img/zip/jpg')
async def img_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}]}
class Imgs(BaseModel):
imgs = [] # type: list[str]
level ="" # type: str
outpath = [] # type: list[str]
@app.post('/img/zip/jpg/many')
async def img_zip_jpg(Imgs:Imgs):
print(Imgs)
result=[]
for i in range(len(Imgs.imgs)):
r= PicDeal.zipJPG(Imgs.imgs[i], Imgs.level, Imgs.outpath[i])
state="1"
if r== "ERROR-IMG-ZIP-JPG-WRITE":
state="0"
if r == "ERROR-IMG-ZIP-JPG-DEAL":
state = "-1"
if r== "ERROR-IMG-ZIP-JPG-LEVEL":
state="-2"
result.append({"state": state, "result": r})
return {"data":{"result":result}}
下面是我做的。



手机拍的照片,1.84MB压缩成468kb(默认75)情况下
手机拍的照片,2.56MB压缩成532kb(默认50)情况下
【Python】【图像处理】图片压缩方法的更多相关文章
- Android图片压缩方法总结
本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 第一:质量压缩方法: ? 1 2 3 ...
- android图片压缩方法
android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = ...
- iOS 图片压缩方法
iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...
- Android应用开发中三种常见的图片压缩方法
Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法 private Bitmap com ...
- 降低PNG图片存储大小方法、图片压缩方法
降低PNG图片存储大小方法,图片压缩方法,如何降低PNG图片存储大小?前提是分辨率和尺寸大小不变,图形的透明部分不变.请看如下办法,亲测可用. 1. 将PNG图片用PS打开. 2. 图像-模式-8位/ ...
- iOS 史上最全的图片压缩方法集合
做上传图片功能,特别是类似于微信,QQ里面,公布9张图片, 少不了碰到一个问题,就是图片压缩问题,当然我也遇到了. 我研究了这个问题,发现网上普遍的方法是例如以下 //压缩图片质量 +(UIImage ...
- PNG、 JPG图片压缩方法
参考链接 https://tinypng.com/developers/reference/python 1.安装 pip install --upgrade tinify 2.使用python脚本压 ...
- Python实现图片压缩
项目中大量用到图片加载,由于图片太大,加载速度很忙,因此需要对文件进行统一压缩 一:导入包 from PIL import Image import os 二:获取图片文件的大小 def get_si ...
- python 下载图片的方法
a='http://wx1.sinaimg.cn/mw600/006HOayNgy1fqjdi2nxohj32pw3o8x6s.jpg' #图片下载地址 ( 这里改成 文件txt地址)w='/U ...
- python下载图片实现方法
转载: https://www.jb51.net/article/119178.htm
随机推荐
- /proc/pids/status
/proc/279/status是一个Linux内核中的文件,其中包含了当前进程的状态信息.每行的含义如下: Name: 进程的名称,例如"java"或"bash&quo ...
- SURF (Speeded Up Robust Features,加速稳健特征)
本篇文章来自wikipedia,如果需要阅读英文,可以去看一下. SURF (Speeded Up Robust Features, 加速稳健特征) 是一个稳健的图像识别和描述算法,首先于2006年发 ...
- 2021年6月国产数据库排行榜:OceanBase、PolarDB会师TiDB、openGauss,入局开源阵营,逐鹿生态建设
"首夏犹清和,芳草亦未歇",时至六月,百花齐放.百家争鸣的国产数据库市场依旧延续着如骄阳般火热的态势.不过从最新一期的 国产数据库流行度排行榜 Top 10 中不难发现,一个词足以 ...
- 如何判断 js 的数据类型
js 数据类型 一共 7 种 undefined . null . number . string . boolean .object . symbol 其中 object 可以细分 位 数组对象 ...
- Kafka原理剖析之「Purgatory(炼狱 | 时间轮)」
一.前言 本文介绍一下Kafka赫赫有名的组件Purgatory,相信做Kafka的朋友或多或少都对其有一定的了解,至少是听过它的名字.那它的作用是什么呢,用来解决什么问题呢?官网confluent早 ...
- 妙用编辑器:使用Notepad--列编辑功能批量生成维护命令
应用场景 在日常工作中,维护人员可能会要批量生成一些配置命令,示例如下:添加12个分组 ADD GROUP:GID=1,FCN=646322; ADD GROUP:GID=1,FCN=646322; ...
- Meteor:全栈JavaScript开发框架的先驱
Meteor 是一个功能强大且易用的全栈 JavaScript 框架,它简化了现代 Web 应用的开发流程,从数据库到用户界面都可以通过一套统一的技术栈来实现.无论你是构建实时应用还是想要一个快速的原 ...
- 项目中maven依赖无法自动下载
[解决方法]: 安装目录conf--修改settting.xml文件在mirrors标签下添加子节点 <mirrors> <!-- mirror | Specifies a repo ...
- 题解:CF1015D Walking Between Houses
题解:CF1015D Walking Between Houses 算法 模拟,分类讨论 分析 首先,设每步走的距离为 \(t_i\),我们发现 \(t_i\) 应是满足 \(1\le t_i\le ...
- 开源 - Ideal库 - 常用枚举扩展方法(二)
书接上回,今天继续和大家享一些关于枚举操作相关的常用扩展方法. 今天主要分享通过枚举值转换成枚举.枚举名称以及枚举描述相关实现. 我们首先修改一下上一篇定义用来测试的正常枚举,新增一个枚举项,代码如下 ...