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

当然这并非真的无损。

我采用了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. 如何理解iowait

    Linux中,%iowait 过高可能是个问题,严重的时候,它能使服务停止, 但问题是,多高才算高? 什么时候应该担心呢? 本文将讨论 iowait 的含义.相关的统计数据.原理以及 iowait的瓶 ...

  2. innerText 和 inner HTML 的区别

    获取内容时: innerText会自动删除空格和换行:innerHTML会保留空格和换行: <body> <div>获 取内 容</div> <script& ...

  3. 关于 vue3 中的 fragment 组件

    vue3 中的模板中只能返回一个元素 ,否则报错,使用 fragment 组件可以返回多个元素标签

  4. 存储事件 storage

    // 去手动删除本地存储触发存储事件 window.addEventListener('storage', function () { console.log('存储事件触发了') }) const ...

  5. 7-11 leetcode 2619

    请你编写一段代码实现一个数组方法,使任何数组都可以调用 array.last() 方法,这个方法将返回数组最后一个元素.如果数组中没有元素,则返回 -1 . ps:this 环境变量的使用 ,this ...

  6. 删除 设置 获取 cookies 的第三方包 js-cookies

    // 第三方包 js-cookies 是一个操作cookies的包 import Cookies from 'js-cookie' // Cookies.set(key,value) 存值 // Co ...

  7. day10-变量、常量、作用域及命名规范

    变量 变量是什么?就是可以变化的量! Java是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括变量名.变量类型和作用域.   type varName [ ...

  8. Octave 安装教程

    Octave 用心写著. Octave为GNU项目下的开源软件.同时它也是一种语言,专注于解决线性计算问题.因为对于矩阵计算的优化,使得其速度远高于循环计算.语法兼容Linux shell. Octa ...

  9. 使用pandas进行数据分析

    目录 1.pandas的特点 2.Series 2.1新建Seriws 2.2使用标签来选择数据 2.3 通过指定位置选择数据 2.4 使用布尔值选择数据 2.5 其他操作 2.5.1 修改数据 2. ...

  10. Hugging Face 与 TruffleHog 合作,实现风险预警

    我们非常高兴地宣布与 Truffle Security 建立合作伙伴关系并在我们的平台集成 TruffleHog 强大的风险信息扫描功能.这些特性是 我们持续致力于提升安全性 的重要举措之一. Tru ...