图片压缩算法优化

news2024/9/22 13:23:30

正常的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 = 600
        ratio = 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_bytes
    except 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:  # RGBA
            print('RGBA')
            # 将 RGBA 转换为 BGRA
            image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGRA)
        elif image.shape[2] == 3:  # RGB
            # 将 RGB 转换为 BGR
            image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

        h, w, c = image.shape
        max_size = 600
        ratio = 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_bytes
        else:
            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 或 RGB
        if image.shape[2] == 4:  # RGBA
            print("输入的图像是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.0
            for c in range(3):
                background[..., c] = (alpha_mask * foreground[..., c] + (1 - alpha_mask) * background[..., c])

            image = background  # 使用白色背景图像替换原图

        h, w, c = image.shape
        max_size = 600
        ratio = 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_bytes
        else:
            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.coloradmin.cn/o/2097317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

转换视频格式轻松搞定!3个小窍门助你轻松将mxf格式转mp4

你是否因为格式转换而烦恼?你是否经历过这样的情况:你想要在别的设备或平台上播放心仪的视频,但是你的视频文件是xmf格式的,很多设备都不支持这个格式,导致视频无法播放。现在,你需要把mxf格式转mp4格式。你…

黑马-Cloud21版-实用篇02:Nacos配置管理、集群,Feign远程调用、Feign的抽取优化,Gateway服务网关、网关中的跨域问题

SpringCloud实用篇02 0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我…

编译器基础介绍

随着深度学习的不断发展,AI 模型结构在快速演化,底层计算硬件技术更是层出不穷,对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来,还要应对 AI 框架的持续迭代。AI 编译器就成了应对以上问题广受关注的技…

中资优配:什么股票容易涨停?放量涨停意味着什么?

什么股票简单涨停: 1、抢手题材股。每当商场出现新的方针改变、职业改造或严重利好事情时,相关股票往往会遭到资金的会合注重,从而引发涨停潮。例如一些职业股票在方针支撑和技术打破的两层驱动下,很简单成为商场短线资金追逐的抢…

qt实现三原色滑动条变色

在qt中有这样一个控件: 就是这个Horizontal Slider他的作用相信大家都知道了,也就是通过滑动来改变数值。今天我们就使用这个控件实现一个三原色滑动变色。 实现效果: 1.创建UI界面 这个就不用多说了,这个大家就按照我的这个去…

数据结构-双链表-详解

数据结构-双链表-详解 1.前言2.结构2.1双向2.2带头2.3循环 3.实现3.1结构体3.2初始化与删除初始化删除 3.3插入尾插头插 3.4删除尾删头删 3.4查找3.5pos位置的插入删除 1.前言 链表总共有八种:双向、单向;带头、不带头;循环、不循环。(8 2 …

C++第四十四弹---Lambda表达式的妙用:高效解决编程中的匿名函数问题

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1 lambda表达式 1.1 C98中的一个例子 1.2 lambda表达式 1.3 lambda表达式语法 1.4 函数对象与lambda表达式 1 lambda表达式 1.1 C98中的一个例…

上门家政系统

上门家政系统是基于likeadmin开发的上门家政预约系统,提供全部前后台无加密源代码,拥有强大的地图定位、在线预约、系统派单、指定派单、下单支付、核销订单等功能模块,用户端和师傅端完美融合,随时随地都能接单;可自定…

vs中在工具箱添加自定义控件numberTextBox

在winform中没有numberTextBox控件,为了将numberTextBox添加到工具箱当中,于是参考以下博客封装了一个自定义numberTextBox控件: winform 自定义数值(数字)输入框_c#如何设置一个框输入值-CSDN博客 接下来介绍以下封装和引用的过程&#xf…

淘宝直通车投放优化(进阶版本)

相爱相杀何时休,只看今篇论英雄! 看目录上电梯,各去对应楼层耍。顶楼的风景最迷人。38719字诸君细读。 第一阶段:基础认识和推广(新手可从头看起) 第二阶段:明确原理与逻辑(运营/推广同学从此看做到心中有数) 第三阶段:实战中涅槃(知其然,知其所以然) 第一阶…

MySQL之DQL简单查询

1、结构化查询语言 1. 什么是SQL 结构化查询语言(Structured Query Language),后续通常简称SQL。SQL是用于存取数据以及查询、更新和管理关系数据库系统的标准语言。20世纪70年代由IBM公司开发,目前应用于各种关系型数据库。SQL是一套标准,…

黄金市场步入数据驱动的关键周:多空角力聚焦非农就业

一、市场情绪分化,黄金波动趋于平稳 本周黄金市场在经历了一系列波动后,价格维持在2500美元/盎司上方波动,显示出相对稳定的交易状态。Kitco新闻黄金调查显示,分析师对下周金价走势的看法分歧较大,而零售投资者看涨情绪…

TCP/IP网络编程:第18章聊天室

服务端&#xff1a;负责连接客户端&#xff0c;转发客户端的信息给其他客户 客户端&#xff1a;发送信息给服务端&#xff0c;接收服务端传来的其他客户的信息 服务端代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #incl…

OpenCV开发笔记(八十):基于特征点匹配实现全景图片拼接

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141790116 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

YOLOS:大道至简,直接使用预训练ViT进行实时目标检测 | NeurIPS 2021

论文探索了在中型ImageNet-1k数据集上预训练的普通ViT到更具挑战性的COCO目标检测基准的可迁移性&#xff0c;提出了基于Vision Transformer的You Only Look at One Sequence(YOLOS)目标检测模型。在具有挑战性的COCO目标检测基准上的实验结果表明&#xff0c;2D目标检测可以以…

Windows系统通过WSL2安装Ubuntu22.04系统及图形化界面

1.通过WSL2安装Ubuntu22.04系统及图形化界面 WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个为Windows用户设计的兼容层&#xff0c;它允许用户在Windows10和Windows11操作系统上直接运行GNU/Linux环境。WSL提供了一个微软开发的Linux兼容内核接口&#xff0c…

MySQL中的时间与当前时间相差8个小时,两步解决。

前言&#xff1a; 有朋友后台私信问&#xff0c;我服务器中的MySQL时间与本地时间差了8个小时&#xff0c;我在给表中字段设置根据时间戳自动更新时会出现时间与当前时间不符的原因。灰常简单&#xff0c;一起来看看吧。 第一步&#xff1a; 在MySQL中&#xff0c;输入命令&…

基于asp.net软件缺陷跟踪系统设计与实现

系统分析 本章讲述了本软件缺陷跟踪系统的前期分析方法和分析结论。 3.1 可靠性分析 在软件研发企业或研发团队中&#xff0c;开发人员和测试人员所应用的软件缺陷管理的主要方法流程是&#xff1a; 1&#xff0e;测试人员发现软件存在的缺陷&#xff0c;填写缺陷报告&…

【正点原子K210连载】第三十四章 image图像滤波实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第三十四章 image图像滤波实验 在上一章节中&#xff0c;介绍了image模块中元素绘制方法给的使用&#xff0c;本章将继续介绍image模块中图像滤波方法的使用。通过本章的学习&#xff0c;读者将学习到image模块中图像滤波的使用。 本章分为如下几个小节&#xff1a; 34.1 imag…

Transformer直接预测完整数学表达式,推理速度提高多个数量级

前言 来自 Mata AI、法国索邦大学、巴黎高师的研究者成功让 Transformer 直接预测出完整的数学表达式。 转载自丨机器之心 符号回归&#xff0c;即根据观察函数值来预测函数数学表达式的任务&#xff0c;通常涉及两步过程&#xff1a;预测表达式的「主干」并选择数值常数&am…