PNG图片压缩-UPNG.js参数说明及示例

news2025/1/14 20:39:39

UPNG.js是一个非常轻量且高效的库,用于处理PNG图像。它可以编码和解码PNG图片,同时支持压缩和解压缩功能。特别适合在前端项目中处理图像,尤其是在需要优化图像大小而不牺牲质量时。

UPNG.encode()函数是UPNG.js中用于将图像数据编码成PNG格式的函数,参数如下:

UPNG.encode(imgs, w, h, cnum, dels, forbidPlte)

imgs:图像数据。它是一个Uint8Array数组的数组,其中每个Uint8Array代表一个图像帧的RGBA像素数据。

w(width):生成的PNG图像的宽度(以像素为单位)。

h(height):生成的PNG图像的高度(以像素为单位)。

cnum:颜色数量。这个参数决定了输出PNG的颜色深度。比如,将其设置为256会生成8位颜色的PNG图像。特别地,设置为0会让UPNG.js自动选择最优的颜色数量。

dels:帧延时数组,仅当imgs包含多个帧以生成动画PNG时有效。每个元素代表对应帧的延时时间(以毫秒为单位)。

forbidPlte(可选):这是一个布尔值参数,当设置为true时,会禁止生成带有调色板(palette)的PNG。调色板PNG通常用于压缩图像大小而不是质量,但不是所有场景都需要或希望使用调色板。

 

  • 低颜色复杂度:如果你的图像具有很少的颜色(例如图标、简单图形、拥有大块单色区域的图片),则使用较低的cnum值(比如16、64或128)可能是合适的。这样可以减小文件大小,同时保持质量。
  • 高颜色复杂度:对于颜色渐变丰富、细节复杂的照片,低cnum值可能导致质量明显下降。对于这类图片,较高的cnum值或者自动选择(cnum=0)更合适。
  • 网页用途:对于网页用途,你可能希望图像尽可能小以加快页面加载速度。开始可以尝试中等cnum值(如256),根据结果调整或考虑自动选择。
  • 打印或高质量展示:当图像质量是首要考虑时,应优先考虑较高的cnum值,甚至自动选择,以尽可能保留原图的质量和细节。

 

当cnum设置为0时,UPNG.js试图自动确定最佳颜色数以平衡大小和质量,但这并不总能得到最小文件大小。因为自动选择可能会倾向于保留更多的颜色以保证质量,而这有时会导致文件大小的增加,尤其是对于本来就有很多颜色的图片。

 

cnum(颜色数量)的取值范围是从0到32767。具体取值范围如下:

  • 0:自动选择颜色数量,UPNG.js将尝试自动确定最佳的颜色数量以平衡文件大小和图像质量。
  • 1 - 255:指定一个固定的颜色数量。较小的值会产生更小的文件大小,但可能会降低图像质量。
  • 256 - 32767:当cnum大于255时,UPNG.js将尝试最小化文件大小,同时保持足够高的图像质量。

 

示例:

function handlePNG(file) {

  const reader = new FileReader();

  reader.onload = function (e) {

      try {

          const arrayBuffer = e.target.result;

          const decodedImg = UPNG.decode(arrayBuffer); // 解码

          const rgba = UPNG.toRGBA8(decodedImg); // 转换为RGBA数组,每个帧一个元素

          // 压缩和重编码图像,颜色值可根据实际需求调整

          const compressedArrayBuffer = UPNG.encode(rgba, decodedImg.width, decodedImg.height, 0);

          // 处理压缩后的图像

          // 例如,将其转换为Blob,然后URL.createObjectURL可以用于显示图片:

          const blob = new Blob([compressedArrayBuffer], {type: 'image/png'});

          const imageUrl = URL.createObjectURL(blob);

          console.log(imageUrl); // 用于显示或下载图片等

      } catch (error) {

          console.error("处理PNG文件时出错: ", error);

      }

  };

  reader.onerror = function (error) {

      console.error("读取文件时出错: ", error);

  };

  reader.readAsArrayBuffer(file);

}

体验参考:

 简单设计EasyDesign-免费在线设计工具图片处理工具icon-default.png?t=N7T8https://jiandan.link/#/imagetools?index=0&com=ImageCompress

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1459140.html

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

相关文章

量化巨头“卖空”被刷屏!网友:又一类量化策略要“收摊”了

量化圈遇到了龙年首宗“大事件”! 2月20日晚间,沪深交易所同时出手对量化巨头灵均投资的异常交易行为进行“处理”。 沪深交易所均称发现灵均在2月19日开盘1分钟内,名下多个账户通过计算机程序自动生产交易指令,短时间大量下单卖…

WireShark 安装指南:详细安装步骤和使用技巧

Wireshark是一个开源的网络协议分析工具,它能够捕获和分析网络数据包,并以用户友好的方式呈现这些数据包的内容。Wireshark 被广泛应用于网络故障排查、安全审计、教育及软件开发等领域。接下将讲解Wireshark的安装与简单使用。 目录 Wireshark安装步骤…

过了30岁了,一定要专注一件事情?视频号值得尝试!

经常说视频号下载助手, 但发现大多数的大佬都只是先专注一件事情。 小编初6就回来了,和一个大佬吃饭,虽然人家规模并不大,但日引客户上千也是基本的。 这里给大家揭秘一下,他的做法!!&#x…

猫头虎分享已解决Bug || 脚本执行错误(Script Execution Failure):ScriptError, ExecutionFailure

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

挑战30天学完Python:Day15 错误类型

📘 Day 14 🎉 本系列为Python基础学习,原稿来源于 30-Days-Of-Python 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,或仅了解Python一点…

Linux编辑器——Vim详解

目录 ⭐前言 ⭐vim的基本概念 ⭐vim的基本操作 ⭐vim命令模式命令集 ⭐vim末行模式命令集 ⭐简单vim配置 ⭐配置文件的位置 ⭐常用配置选项 ⭐前言 vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容…

课程大纲:图像处理中的矩阵计算

课程名称:《图像处理中的矩阵计算》 课程简介: 图像处理中的矩阵计算是图像分析与处理的核心部分。本课程旨在教授学员如何应用线性代数中的矩阵计算,以实现各种图像处理技术。我们将通过强调实际应用和实践活动来确保学员能够理解和掌握这些…

代码随想录算法训练营第三六天 | 无重叠区间、划分字母区间、合并区间

目录 无重叠区间划分字母区间合并区间 LeetCode 435. 无重叠区间 LeetCode 763.划分字母区间 LeetCode 56. 合并区间 无重叠区间 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠…

vue3 之 商城项目—会员中心

整体功能梳理 1️⃣个人中心—个人信息和猜你喜欢数据渲染 2️⃣我的订单—各种状态下的订单列表展示 路由配置&#xff08;三级路由配置&#xff09; 准备模版member/index.vue <script setup> </script><template><div class"container">…

深度学习图像算法工程师--面试准备(1)

1 请问人工神经网络中为什么 ReLU 要好过于 tanh 和 Sigmoid function&#xff1f; 采⽤Sigmoid 等函数&#xff0c;算激活函数时&#xff08;指数运算&#xff09;&#xff0c;计算量⼤&#xff0c;反向传播求误差梯度时&#xff0c;求导涉及除法和指数运算&#xff0c;计算量…

《VitePress 简易速速上手小册》第2章:Markdown 与页面创建(2024 最新版)

文章目录 2.1 Markdown 基础及扩展2.1.1 基础知识点解析2.1.2 重点案例&#xff1a;技术博客2.1.3 拓展案例 1&#xff1a;食谱分享2.1.4 拓展案例 2&#xff1a;个人旅行日记 2.2 页面结构与布局设计2.2.1 基础知识点解析2.2.2 重点案例&#xff1a;公司官网2.2.3 拓展案例 1&…

软件测试方法_边界值分析法

目录&#xff1a; ①边界值分析法的介绍和概念 ②边界值分析法的原理和思想 ③单缺陷假设和多缺陷假设 ④边界值测试数据类型 ⑤内部边界值分析 ⑥各类边界值测试介绍 ⑦基于边界值分析方法选择测试用例的原则 ⑧边界值分析法的实例分析 1、边界值分析法的介绍和概念 …

力扣94 二叉树的中序遍历 (Java版本) 递归、非递归

文章目录 题目描述递归解法非递归解法 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(7)特征构造

特征分析之后&#xff0c;就是特征构造。 特征构造第一步 特征构造往往要进行数据的归一化。 在本案例中&#xff0c;我们将所有的数据&#xff0c;将所有特征区间调整为0~1之间。 如上图。 那么&#xff0c;为什么要进行归一化&#xff0c;又如何将数据&#xff0c;调整为…

【安卓基础1】初识Android

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职。 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &#xff08;他们的视频后面一部分没再更新&#xff0c;看看前面…

【力扣白嫖日记】1873.计算特殊奖金

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1873.计算特殊奖金 表&#xff1a;Employees 列名类型employee_idintnamevarcharsalaryint employee_id 是…

LeetCode 450.删除二叉搜索树中的节点和669.修建二叉搜索树思路对比 及heap-use-after-free问题解决

题目描述 450.删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;…

代码控制写入excel文件

1、引言 在工作和学习中&#xff0c;我们经常使用到excel表格&#xff0c;有时候表格中的数据很多&#xff0c;此时我们就希望能够通过程序去控制某些表格数据的生成和修改&#xff0c;从而达到简化操作&#xff0c;缩减工作量的目的&#xff0c;这里就来简单实现一下对excel表…

【办公技巧】如何压缩为rar格式文件?

压缩包格式是我们生活工作中常用到的文件格式&#xff0c;那么如何得到一个rar格式的压缩文件&#xff1f;或者说如何将文件压缩成rar格式而不是zip格式呢&#xff1f;今天我们来了解一下如何压缩为rar格式文件。 首先&#xff0c;想要压缩文件&#xff0c;我们需要压缩软件&a…

【C/C++】实现Reactor高并发服务器 完整版

代码结构 文件介绍 InetAddress.h InetAddress类 ip和端口设置 Socket.h Socket类 设置fd Epoll.h epollfd 管理类 Channel.h Channel类 管理epoll以及对应回调函数实现 EventLoop.h EventLoop事件循环类 TcpServer.h 服务器类 tcpepoll.cpp 主函数 InetAddress.h #if…