Nodejs 第十九章(pngquant)

简介: Nodejs 第十九章(pngquant)

什么是pngquant?

pngquant 是一个用于压缩 PNG 图像文件的工具。它可以显著减小 PNG 文件的大小,同时保持图像质量和透明度。通过减小文件大小,可以提高网页加载速度,并节省存储空间。pngquant 提供命令行接口和库,可轻松集成到各种应用程序和脚本中。

http://pngquant.com/

原理是什么?

pngquant 使用修改过的 Median Cut 量化算法以及其他技术来实现压缩 PNG 图像的目的。它的工作原理如下:

  1. 首先,pngquant 构建一个直方图,用于统计图像中的颜色分布情况。
  2. 接下来,它选择盒子来代表一组颜色。与传统的 Median Cut 算法不同,pngquant 选择的盒子是为了最小化盒子中颜色与中位数的差异。
  3. pngquant 使用感知模型给予图像中噪声较大的区域较少的权重,以建立更准确的直方图。
  4. 为了进一步改善颜色,pngquant 使用类似梯度下降的过程对直方图进行调整。它多次重复 Median Cut 算法,并在较少出现的颜色上增加权重。
  5. 最后,为了生成最佳的调色板,pngquant 使用 Voronoi 迭代(K-means)对颜色进行校正,以确保局部最优。
  6. 在重新映射颜色时,pngquant 只在多个相邻像素量化为相同颜色且不是边缘的区域应用误差扩散。这样可以避免在视觉质量较高且不需要抖动的区域添加噪声。

通过这些步骤,pngquant 能够在保持图像质量的同时,将 PNG 图像的文件大小减小到最低限度。

Median Cut 量化算法

假设我们有一张 8x8 像素的彩色图像,每个像素由红色、绿色和蓝色通道组成,每个通道的值范围是 0 到 255。

  1. 初始化:我们将图像中的每个像素视为一个颜色点,并将它们放入一个初始的颜色桶。
  2. 选择划分桶:在初始的颜色桶中选择一个具有最大范围的颜色通道,假设我们选择红色通道。
  3. 划分颜色:对于选定的红色通道,将颜色桶中的颜色按照红色通道的值进行排序,并找到中间位置的颜色值作为划分点。假设划分点的红色值为 120。划分前的颜色桶:
  • 颜色1: (100, 50, 200)
  • 颜色2: (150, 30, 100)
  • 颜色3: (80, 120, 50)
  • 颜色4: (200, 180, 160)
  1. 划分后的颜色桶:
  • 子桶1:
  • 颜色1: (100, 50, 200)
  • 颜色3: (80, 120, 50)
  • 子桶2:
  • 颜色2: (150, 30, 100)
  • 颜色4: (200, 180, 160)
  1. 重复划分:我们继续选择颜色范围最大的通道,假设我们选择子桶1中的绿色通道。划分前的颜色桶(子桶1):
  • 颜色1: (100, 50, 200)
  • 颜色3: (80, 120, 50)
  1. 划分后的颜色桶(子桶1):
  • 子桶1.1:
  • 颜色3: (80, 120, 50)
  • 子桶1.2:
  • 颜色1: (100, 50, 200)
  1. 子桶2中只有两个颜色,不需要再进行划分。
  2. 颜色映射:将原始图像中的每个像素颜色映射到最接近的颜色桶中的颜色。
    假设原始图像中的一个像素为 (110, 70, 180),我们将它映射到颜色1: (100, 50, 200)
    大概的公式为 sqrt((110-100)^2 + (70-50)^2 + (180-200)^2) ≈ 31.62
    通过 Median Cut 算法,我们将原始图像中的颜色数目从 64 个(8x8 像素)减少到 4 个颜色桶,从而实现了图像的量化

Nodejs 中 调用pngquant

我们同样还是可以用exec命令调用

import { exec } from 'child_process'
exec('pngquant 73kb.png --output test.png')

73kb 压缩完 之后 22kb

import { exec } from 'child_process'
exec('pngquant 73kb.png --quality=82 --output test.png')

quality表示图片质量0-100值越大图片越大效果越好

import { exec } from 'child_process'
exec('pngquant 73kb.png --speed=1 --quality=82 --output test.png')
  • --speed=1: 最慢的速度,产生最高质量的输出图像。
  • --speed=10: 最快的速度,但可能导致输出图像质量稍微降低。
目录
相关文章
|
9月前
|
JavaScript
nodejs读书笔记
nodejs读书笔记
|
9月前
|
JavaScript Unix Linux
Nodejs 第十二章(path)
Nodejs 第十二章(path)
61 0
|
6月前
|
测试技术 Python
Bottle技术:如何用Python打造小巧而强大的Web开发利器?
【8月更文挑战第31天】Bottle是一个用Python编写的轻量级Web框架,设计简洁、快速且小巧,适用于快速开发Web应用程序。其主要特点包括简单易学、快速开发、小巧轻量及强大的功能,如路由、模板和表单验证等。Bottle的核心概念包括路由、模板和请求对象,可通过示例了解其基本用法。此外,合理使用路由、编写测试和利用Bottle扩展等最佳实践有助于更高效地进行Web开发。随着Bottle生态的不断发展,它将在未来Web开发中扮演更重要的角色。
55 1
|
9月前
|
JSON JavaScript 关系型数据库
❤Nodejs 第十六章(Nodejs环境安装和依赖使用)
【4月更文挑战第16天】本文介绍了Node.js环境安装和项目搭建步骤。检查Node.js和npm版本安装核心依赖,如Express(Web应用框架)、MySQL库、CORS(解决跨域问题)、body-parser(解析POST数据)、express-jwt和jsonwebtoken(JWT验证)、multer(文件上传处理)、ws(WebSocket支持),以及可选的dotenv(管理环境变量)和ejs(模板引擎)。完整源码可在Gitee开源项目[nexusapi](https://gitee.com/lintaibai/nexusapi)中找到。
218 0
|
9月前
|
存储 索引 Python
《Python 简易速速上手小册》第2章:Python 基础语法和概念(2024 最新版)
《Python 简易速速上手小册》第2章:Python 基础语法和概念(2024 最新版)
50 0
|
9月前
|
安全 API 语音技术
Python 潮流周刊#25:性能最快的代码格式化工具 Ruff!
Python 潮流周刊#25:性能最快的代码格式化工具 Ruff!
97 1
|
前端开发 关系型数据库 数据库
前端学 Ruby:唐诗项目部署优化
前端学 Ruby:唐诗项目部署优化
93 0
|
机器人 程序员 Python
怎么快速更新Python的第三方库?教你一招,小白也能学会
怎么快速更新Python的第三方库?教你一招,小白也能学会
151 0
|
Rust 编译器
Rust也出2077? 最受欢迎的编程语言再度更新!(下)
最受欢迎的编程语言Rust,在官方博客中更新了2021 edition的计划,该计划将于10月发布,其中新的功能备受网友们的期待。
566 0
Rust也出2077? 最受欢迎的编程语言再度更新!(下)
|
Rust 安全 编译器
Rust也出2077? 最受欢迎的编程语言再度更新!(上)
最受欢迎的编程语言Rust,在官方博客中更新了2021 edition的计划,该计划将于10月发布,其中新的功能备受网友们的期待。
637 0
Rust也出2077? 最受欢迎的编程语言再度更新!(上)