图片压缩算法优化

2024-09-02 16:28
文章标签 优化 图片 压缩算法

本文主要是介绍图片压缩算法优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正常的rgb三通道的图片用以下压缩算法没啥问题

def zip_img0(image_bytes):'''压缩图片 :param image_bytes::return:'''try:image_np = np.frombuffer(image_bytes, np.uint8)image = cv2.imdecode(image_np, cv2.IMREAD_COLOR)h, w, c = np.shape(image)max_size = 600ratio = min(1, min(max_size / h, max_size / w))# print(ratio)compressed_image = cv2.resize(image, [int(w * ratio), int(h * ratio)])# 将图像编码为WebP格式的字节流success, encoded_image = cv2.imencode('.webp', compressed_image, [int(cv2.IMWRITE_WEBP_QUALITY), 90])# 检查编码是否成功if success:# print(encoded_image)compressed_bytes = encoded_image.tobytes()return compressed_bytesexcept Exception as e:return None

但是对于RGBA类图像做压缩 背景就会变黑

如原图:

在这里插入图片描述
压缩之后:
在这里插入图片描述
一开始针对RGBA类型的,写了个判断处理

def zip_img1(image_bytes):'''压缩图片 有些是青紫色:param image_bytes: 原始图片的字节流:return: 压缩后的图片字节流'''try:# 将字节流转换为 NumPy 数组image_np = np.frombuffer(image_bytes, np.uint8)# 解码为图像,使用 IMREAD_UNCHANGED 以保留所有通道image = cv2.imdecode(image_np, cv2.IMREAD_UNCHANGED)if image is None:raise ValueError("Unable to decode the image")# 检查图像的通道数if image.shape[2] == 4:  # RGBAprint('RGBA')# 将 RGBA 转换为 BGRAimage = cv2.cvtColor(image, cv2.COLOR_RGBA2BGRA)elif image.shape[2] == 3:  # RGB# 将 RGB 转换为 BGRimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)h, w, c = image.shapemax_size = 600ratio = min(1, min(max_size / h, max_size / w))# 缩放图像compressed_image = cv2.resize(image, (int(w * ratio), int(h * ratio)))# 将图像编码为 WebP 格式的字节流success, encoded_image = cv2.imencode('.webp', compressed_image, [int(cv2.IMWRITE_WEBP_QUALITY), 90])# 检查编码是否成功if success:compressed_bytes = encoded_image.tobytes()return compressed_byteselse:raise ValueError("Encoding image to WebP failed")except Exception as e:print(f"Error compressing image: {e}")return None

这种针对RGBA 类型的倒是能正常处理了,

但是针对RGB三通道的就有点不好了
如,原图:

在这里插入图片描述

用上面的方法压缩之后:
在这里插入图片描述

所以针对此类型的再优化一下:

def zip_img(image_bytes):'''压缩图片:param image_bytes: 原始图片的字节流:return: 压缩后的图片字节流'''try:# 将字节流转换为 NumPy 数组image_np = np.frombuffer(image_bytes, np.uint8)# 解码为图像,保留透明通道image = cv2.imdecode(image_np, cv2.IMREAD_UNCHANGED)if image is None:raise ValueError("Unable to decode the image")# 输入图像可能是 RGBA 或 RGBif image.shape[2] == 4:  # RGBAprint("输入的图像是RGBA格式")# 分离通道b, g, r, a = cv2.split(image)# 创建一个白色背景background = np.ones((image.shape[0], image.shape[1], 3), dtype=np.uint8) * 255# 将前景(带有透明度的图像)叠加到白色背景上foreground = cv2.merge((b, g, r))alpha_mask = a.astype(float) / 255.0for c in range(3):background[..., c] = (alpha_mask * foreground[..., c] + (1 - alpha_mask) * background[..., c])image = background  # 使用白色背景图像替换原图h, w, c = image.shapemax_size = 600ratio = min(1, min(max_size / h, max_size / w))# 缩放图像compressed_image = cv2.resize(image, (int(w * ratio), int(h * ratio)))# 将图像编码为 WebP 格式的字节流,设置压缩质量success, encoded_image = cv2.imencode('.webp', compressed_image, [int(cv2.IMWRITE_WEBP_QUALITY), 90])# 检查编码是否成功if success:compressed_bytes = encoded_image.tobytes()return compressed_byteselse:raise ValueError("Encoding image to WebP failed")except Exception as e:print(f"Error compressing image: {e}")return None

这样两种类型的都兼容了。

最后提供两种类型的图片url测试

 # RGBA
image_url = 'https://img.vitkac.com/uploads/product_thumb/SUKIENKA%20M-ONERVAX%20A12396%200DLAX-9XX/lg/1.png'# RGB
image_url = "https://cdn.shopify.com/s/files/1/0020/4236/4017/files/ISNA-TOP-POWDER-BLUE-XO-HEART-WHTE-BINDA2.jpg?v=1719481642"

这篇关于图片压缩算法优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130471

相关文章

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.