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

当然这并非真的无损。

我采用了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】【图像处理】图片压缩方法的更多相关文章

  1. Android图片压缩方法总结

    本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩).   第一:质量压缩方法:   ? 1 2 3 ...

  2. android图片压缩方法

    android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = ...

  3. iOS 图片压缩方法

    iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...

  4. Android应用开发中三种常见的图片压缩方法

    Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法 private Bitmap com ...

  5. 降低PNG图片存储大小方法、图片压缩方法

    降低PNG图片存储大小方法,图片压缩方法,如何降低PNG图片存储大小?前提是分辨率和尺寸大小不变,图形的透明部分不变.请看如下办法,亲测可用. 1. 将PNG图片用PS打开. 2. 图像-模式-8位/ ...

  6. iOS 史上最全的图片压缩方法集合

    做上传图片功能,特别是类似于微信,QQ里面,公布9张图片, 少不了碰到一个问题,就是图片压缩问题,当然我也遇到了. 我研究了这个问题,发现网上普遍的方法是例如以下 //压缩图片质量 +(UIImage ...

  7. PNG、 JPG图片压缩方法

    参考链接 https://tinypng.com/developers/reference/python 1.安装 pip install --upgrade tinify 2.使用python脚本压 ...

  8. Python实现图片压缩

    项目中大量用到图片加载,由于图片太大,加载速度很忙,因此需要对文件进行统一压缩 一:导入包 from PIL import Image import os 二:获取图片文件的大小 def get_si ...

  9. python 下载图片的方法

    a='http://wx1.sinaimg.cn/mw600/006HOayNgy1fqjdi2nxohj32pw3o8x6s.jpg'  #图片下载地址   ( 这里改成 文件txt地址)w='/U ...

  10. python下载图片实现方法

    转载: https://www.jb51.net/article/119178.htm

随机推荐

  1. 5. 介绍CSS层级

    层级的大小使用 z-inde 来定义,层级大的会覆盖层级小的 : 举个例子,我们设计弹窗的时候,会涉及三个层面,我们把遮罩层mask放在第二层,把弹窗内容放在第一层 ,页面内容显示在第三层:

  2. .NET 工控网关 轻量级组态软件

    前言 C# 工控网关 + 轻量级组态软件. 项目介绍 SharpSCADA 是一个开源项目,提供灵活且强大的解决方案,以满足工业自动化和监控的需求. 作为一个轻量级的工业控制网关和组态软件,Sharp ...

  3. C#轻松实现Modbus通信

    1.前言 大家好!我是付工.前面给大家介绍了一系列关于RS485与Modbus的知识. 终于有人把RS485说清楚了终于有人把Modbus说明白了通透!终于把ModbusRTU弄明白了这样看来,Mod ...

  4. 黑神话:悟空电脑太卡?配置不够?ToDesk云电脑入门新手教程

    许多玩家在玩<黑神话:悟空>时会遭遇硬件配置不足导致的游戏卡顿.画面不流畅等问题. 其实这个难题很好解决,用ToDesk云电脑即可迎刃而解.即使你的本地电脑配置不高,也能享受到流畅的游戏体 ...

  5. ROS入门21讲(3)

    七.话题消息的定义和使用 目的:实现Publisher 与 Subscriber 之间的传输 1.自定义话题消息 如何自定义话题消息? ①完成数据接口的定义---定义msg文件 Person.msg ...

  6. Java编程案例(专题)

    文章目录 案例一:买飞机票 案例二:开发验证码 案例三:评委打分 案例四:数字加密 案例五:数组拷贝 案例六:抢红包 案例七:找素数 案例八:模拟双色球 8.1 手动投注 8.2 随机开奖号码 8.3 ...

  7. SpringBoot学习 _02 _配置单数据源(1)

    SpringBoot学习 _02 _配置单数据源(1) 1.通过IDEA创建SpringBoot项目 直接到选择依赖这一步,选择如图所示的 五个依赖即可 2.配置文件的编写 此处说明一下,这个数据库连 ...

  8. DB GPT本地安装部署

    源码下载 git clone https://github.com/eosphoros-ai/DB-GPT.git Miniconda环境安装 Miniconda 安装 mkdir -p ~/mini ...

  9. Clickhouse入门及实践

    ClickHouse安装 采用doker安装测试: 拉取服务端 docker pull yandex/clickhouse-server 拉取客户端 docker pull yandex/clickh ...

  10. UIAbility组件生命周期

    当用户打开.切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换.UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改 ...