图片压缩算法优化

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

相关文章

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

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

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

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

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规