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

当然这并非真的无损。

我采用了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. Android Systrace 基础知识 -- 分析 Systrace 预备知识

    1. 正文 1.1 线程状态查看 Systrace 会用不同的颜色来标识不同的线程状态, 在每个方法上面都会有对应的线程状态来标识目前线程所处的状态,通过查看线程状态我们可以知道目前的瓶颈是什么, 是 ...

  2. Java日期时间API系列27-----Jdk8中java.time包中的新的日期时间API类,使用xk-time工具类创建日历应用,自定义节假日,工作日和打印日历表。

    1.日历相关类 1.1 日历类 CalendarWrapper package com.xkzhangsan.time.calendar; import java.io.Serializable; i ...

  3. Vue 组件如何进行传值的?

    1 父子传值 在子组件标签设置属性,在子组件内使用 props 接收属性值 : 2. 子父传值 在子组件中使用 emit 自定义事件,在子组件标签注册自定义事件 ,接收参数 : 3. vuex 状态管 ...

  4. 1.flask 源码解析:简介

    目录 一.flask 源码解析:简介 1.1 flask 简介 1.2 两个依赖 1.2.1 werkzeug 1.2.2 Jinja2 1.3 如何读代码 Flask 源码分析完整教程目录:http ...

  5. jenkins 配置flyway报错No value provided for placeholder expressions: ${name}

    业务场景:使用flyway将一个数据库的变更同步到另一个数据库,数据同步到一半的时候报错 No value provided for placeholder expressions: ${name}. ...

  6. spring boot中使用quratz实现定时。 使用task直接调用的实现方法

    1.定义工作类 2.创建配置类,将工作对象绑定到工作明细,然后创建触发器 与工作明细进行绑定 二.使用task实现定时任务 1.启动类上开启定时功能 2.在需要定时的任务上增加Schedule注解,并 ...

  7. 开源 - Ideal库 - 常用时间转换扩展方法(一)

    从事软件开发这么多年,平时也积累了一些方便自己快速开发的帮助类,一直在想着以什么方式分享出来,因此有了这个系列文章,后面我将以<开源-Ideal库>系列文章分享一些我认为比较成熟.比较方便 ...

  8. C++学习——类当中static关键字的作用

    一.类和对象 我们知道类是"行为"和"属性"的集合,我们可以通过类来实例化对象,从而定义对象的"行为"和"属性".比如: ...

  9. VMware使用Ubuntu20.04时发生屏幕闪烁

    问题:VMware使用Ubuntu20.04时发生屏幕闪烁 分析:这是由于虚拟机里面的显示器不支持3D加速问题导致的 解决方法:关闭虚拟机 → 左上角菜单 → 虚拟机 → 设置 → 显示器 → 取消勾 ...

  10. C++之OpenCV入门到提高005:005 图像操作

    一.介绍 今天是这个系列<C++之 Opencv 入门到提高>得第五篇文章.这篇文章也不难,介绍如何图像的基本操作,比如:读取一张图片的像素值,如何修改一张图片中的像素值,如何读取一张图片 ...