性能优化系列之怎么让图片加载得更快?

news2024/11/14 1:35:59

文章の目录

  • 一、压缩png
    • 1、优势
    • 2、说明文档
    • 3、安装
    • 4、使用
      • 4.1、环境
      • 4.2、示例
      • 4.3、API
      • 4.4、还有一个第三库是对当前库的封装,叫jdf-png-native【版本1.1.0,环境同node-pngquant-native】,使用方法和node-pngquant-native差不多
  • 二、压缩jpg
    • 1、优势
    • 2、官网
    • 3、下载
    • 4、使用方法
  • 三、压缩 gif
    • 1、介绍
    • 2、安装
    • 3、使用方式
  • 四、图片尺寸随网络环境变化
  • 五、响应式图片
  • 六、逐步加载图像
    • 1、使用统一占位符
    • 2、使用LQIP
      • 2.1、安装
      • 2.2、源码
      • 2.3、示例
      • 2.4、方法介绍
        • 2.4.1、lqip.base64(filePath: string)
        • 2.4.2、lqip.palette(filePath: string)
    • 3、使用 SQIP
      • 3.1、安装
      • 3.2、源码
      • 3.3、示例
      • 3.4、方法和返回值介绍
  • 七、真的需要图片吗?
  • 写在最后


一、压缩png

本文介绍的第三方库node-pngquant-native

1、优势

跨平台,压缩比高,压缩 png24 非常好。

2、说明文档

https://www.npmjs.com/package/node-pngquant-native

3、安装

npm install -g node-pngquant-native

4、使用

4.1、环境

我在win10 32位系统中安装nodejs的版本为5.12.0,node-pngquant-native依赖的版本号为2.1.1
如果你们在使用下面的示例代码的时候报这个错误时
在这里插入图片描述> 解决方法:可以在node_modules中找到node-pngquant-native相应的文件夹,对其中的index.js文件中指定的行进行修改,我只是下方if判断的代码拿出来,直接使用,就可以了。

在这里插入图片描述

4.2、示例

var pngquant = require("node-pngquant-native");
var fs = require("fs");

fs.readFile("./in.png", function (err, buffer) {
	if (err) throw err;
	var resBuffer = pngquant.compress(buffer, {
		speed: 1 //1 ~ 11
	});

	fs.writeFile(
		"./out.png",
		resBuffer,
		{
			flags: "wb"
		},
		function (err) {}
	);
});

4.3、API

  • pngquant.compress(buffer, option)
  • 第一个参数为文件流
  • 第二个参数是配置对象

第二个配置对象中有一个属性`speed``速度/质量的权衡从1(蛮力)到11(最快)。默认值是3。Speed 10的质量降低了5%,但比默认值快8倍。速度11禁用抖动并降低压缩级别。

如果其他的API见node-pngquant-native

4.4、还有一个第三库是对当前库的封装,叫jdf-png-native【版本1.1.0,环境同node-pngquant-native】,使用方法和node-pngquant-native差不多

npm i jdf-png-native
var pngquant = require("jdf-png-native");
var fs = require("fs");

fs.readFile("./in.png", function (err, buffer) {
	if (err) throw err;

	var resBuffer = pngquant.option({}).compress(buffer);

	fs.writeFile(
		"./out.png",
		resBuffer,
		{
			flags: "wb"
		},
		function (err) {}
	);
});

二、压缩jpg

本文介绍的第三方库jpegtran

1、优势

跨平台,有 Linux、Mac、 Windows 的解决方案

2、官网

http://jpegclub.org/jpegtran/

3、下载

http://jpegclub.org/jpegtran.exe

4、使用方法

jpegtran -copy none -optimize -outfile out.jpg in.jpg

三、压缩 gif

本文介绍的第三方库gifsicle

1、介绍

Gifsicle:通过改变每帧比例,减小 gif 文件大小,同时可以使用透明来达到更小的文件大小,目前公认的解决方案。

2、安装

https://eternallybored.org/misc/gifsicle/

3、使用方式

  • 优化级别设置为不小于 2,1 的话基本不压缩
gifsicle --optimize=3 -o out.gif in.gif
  • 将透明部分截去
gifsicle --optimize=3 --crop-transparency -o out.gif in.gif

四、图片尺寸随网络环境变化

  • 不同网络环境(Wifi/4G/3G)下,加载不同尺寸和像素的图片,通过在图片 URL 后缀加不同参数改变。

https://m.360buyimg.com/babel/s100x100_jfs/t1/141193/14/31496/79956/6397e466Ed616b604/289a249c724c46ca.jpg!q70.dpg

可以通过改变其中100x100的尺寸加载不同的图片

五、响应式图片

  • JavaScript 绑定事件检测窗口大小
  • CSS 媒体查询
@media screen and (max-width: 640px) {
	my_image {
		width: 640px;
	}
}
  • img 标签属性
<img srcset="img-320w.jpg, img-640w.jpg 2x, img-960w.jpg 3x" src="“img-960w.jpg”" alt="“img”" /> 

(x 描述符:表示图像的设备像素比)

六、逐步加载图像

1、使用统一占位符

2、使用LQIP

低质量图像占位符(Low Quality Image Placeholders)

2.1、安装

本库博主清测有效,环境是win11 64为,nodejs【16.13.0】,lqip【2.1.0】

npm i lqip

2.2、源码

https://github.com/zouhir/lqip-loader

2.3、示例

const lqip = require("lqip");

const file = "./in.png";

//image
lqip.base64(file).then(res => {
	console.log(res);
});

//color
lqip.palette(file).then(res => {
	console.log(res);
});

然后将生成的base64 url在html的img中标签中使用

<img src="in.png" />
<br />
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAECAYAAAC3OK7NAAAAAklEQVR4AewaftIAAACUSURBVAXB0QrBUBzA4d9/52zLthK1kjTl3hvYE4hn8FZehSTJQ3CluJhiM9QS2Tm+T7LN3Cpl8Js3vPCN1ke+z4KfHtFo9ykzl/L0QNciiPiIsZjrlspLWa4N+/OB2bgFToSIoI2FGvj8Emw9QWRA0g1Y7FZcijsuFZ7robVSIBYDOGGPV54Td2Km6RDfdQjCCOUIf1XhMMa8r80zAAAAAElFTkSuQmCC" />

效果如下:

在这里插入图片描述
第二张图是lqip生成的base64显示的效果

2.4、方法介绍

2.4.1、lqip.base64(filePath: string)

此方法接受图像文件路径,文件必须是这些格式之一['jpeg', 'jpg', 'png'],并返回一个有效的Base64图像字符串,可以在web应用程序中使用,如标签source或CSS属性url。

2.4.2、lqip.palette(filePath: string)

此方法接受图像文件路径,并返回一个调色板作为HEX颜色值数组。返回的数组按照主色从高到低的顺序排序。

3、使用 SQIP

基于 SVG 的图像占位符(SVG Quality Image Placeholders)

3.1、安装

本库博主清测有效,环境是win11 64为,nodejs【16.13.0】,sqip【0.3.3】

npm i sqip

3.2、源码

https://github.com/axe312ger/sqip

3.3、示例

const sqip = require("sqip");

const result = sqip({
	filename: "./in.png",
	numberOfPrimitives: 10
});

console.log(result.final_svg);

然后将生成的svg在html中使用即可

<img src="in.png" />
<br />
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1786 782">
	<filter id="b"><feGaussianBlur stdDeviation="12" /></filter>
	<path fill="#d9b883" d="M0 0h1786v781H0z" />
	<g filter="url(#b)" transform="translate(3.5 3.5) scale(6.97656)" fill-opacity=".5">
		<path fill="#000004" d="M143 33h29v55h-29z" />
		<ellipse fill="#ffe413" rx="1" ry="1" transform="matrix(-40.40891 28.5558 -12.98961 -18.38142 111.6 28.6)" />
		<ellipse fill="#350f00" cx="176" cy="84" rx="16" ry="16" />
		<path fill="#000014" d="M135.8 33.8l10-6.7 22.4 33.1-10 6.7z" />
		<ellipse fill="#efc7a4" rx="1" ry="1" transform="rotate(110.3 38.4 94.2) scale(27.9053 11.70509)" />
		<ellipse fill="#f7d49d" cx="48" cy="53" rx="78" ry="78" />
		<ellipse fill="#f8cb09" rx="1" ry="1" transform="rotate(-140.7 51.7 1.1) scale(19.87192 28.36634)" />
		<ellipse fill="#ffffba" rx="1" ry="1" transform="rotate(-75.3 103.7 -118) scale(17.05 32.69356)" />
		<path fill="#070a2d" d="M152.9 30.8l15-.6 1.2 37-15 .6z" />
		<path fill="#e19300" d="M71.8 56l16.7-17.2L102.2 52 85.5 69.2z" />
	</g>
</svg>

效果如下:

在这里插入图片描述

3.4、方法和返回值介绍

Input options:

  • filename (required)
  • numberOfPrimitives (default=8)
  • mode (default=0)
  • blur (default=12)

Returns:

  • final_svg - string
  • svg_base64encoded - string
  • img_dimensions - object

七、真的需要图片吗?

  • Web Font 代替图片
  • 使用 Data URI 代替图片
  • 采用 Image spriting(雪碧图)

写在最后

如果你感觉文章不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果你觉得该文章有一点点用处,可以给作者点个赞;\\*^o^*//
如果你想要和作者一起进步,可以微信扫描二维码,关注前端老L~~~///(^v^)\\\~~~
谢谢各位读者们啦(^_^)∠※!!!

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

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

相关文章

分享68个PHP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1QB61EsIl70vXx1yrJkiesA?pwdbup1 提取码&#xff1a;bup1 PHP源码 分享68个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载…

【树莓派不吃灰】IO篇① GPIO 开发环境

目录1. 前言1.1 4B GPIO引脚排列2. Python GPIO安装3. 基于C语言的wiringPi安装❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-01-01 ❤️❤️ 本篇更新记录 2023-01-01 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &…

vivo 服务端监控体系建设实践

作者&#xff1a;vivo 互联网服务器团队- Chen Ningning 本文根据“2022 vivo开发者大会"现场演讲内容整理而成。 经过几年的平台建设&#xff0c;vivo监控平台产品矩阵日趋完善&#xff0c;在vivo终端庞大的用户群体下&#xff0c;承载业务运行的服务数量众多&#xff0c…

Modbus-RTU通讯协议中CRC校验

MODBUS协议中的CRC校验_RobotWoods的博客-CSDN博客_modbus crc 以下面这段收发数据为例&#xff1a; 发送的数据是工控机发送给plc的&#xff0c;他们的通信是modbus通信&#xff0c;前面的01。。。。。0f是实际使用的数据&#xff0c;具体意义可以查&#xff0c;后面的4位数87…

对模板类型推演的一个小Bug

在写vector的代码时遇到了这样一个错误 以下是代码书写内容以及我的测试代码 测试代码的目的就是想测试一下我写的vector构造方法 vector(size_t n, const T& val T())&#xff1b; 可是却发生了上述的报错 vector(size_t n, const T& val T()){// 法一&#xff1a…

【云原生】springcloud13——Config分布式配置中心

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;深入、全面、系统的介绍springcloud与springcloud Alibaba微服务常用技术栈 &#x1f330; 文章简介&#xff1a;本文…

JUC并发编程学习笔记(三)集合线程安全及多线程锁

4 集合的线程安全 4.1 集合操作 Demo 创建集合使用string的泛型 for (int i 0; i <30; i) {new Thread(()->{//向集合添加内容list.add(UUID.randomUUID().toString().substring(0,8));//从集合获取内容System.out.println(list);},String.valueOf(i)).start(); }查看…

Odoo 16 企业版手册 - 库存管理之产品变体与属性

产品变体和属性 向客户提供多种产品变体是提高销售的有效策略。Odoo允许您在库存模块中配置产品的不同变体&#xff0c;就像我们在销售和购买模块中所做的那样。首先&#xff0c;确保从库存模块的「设置」菜单中激活「变体」功能&#xff0c;如下所示。 「产品变体」选项可以从…

【MySQL基础教程】事务详细介绍

前言 本文为 【MySQL基础教程】事务 相关知识&#xff0c;下边将对事务简介&#xff0c;事务操作&#xff08;包括&#xff1a;未控制事务&#xff0c;控制事务&#xff09;&#xff0c;事务四大特性&#xff0c;并发事务问题&#xff0c;事务隔离级别等进行详尽介绍~ &#x…

Linux安装mongodb社区版

1、下载资源 Download MongoDB Community Server | MongoDB 2、将下载的安装包上传到服务器上&#xff0c;并解压缩 #解压 tar -zxvf mongodb-linux-x86_64-rhel70-6.0.3.tgz #移动路径重命名mv mongodb-linux-x86_64-rhel70-6.0.3 /usr/local/mongodb 3、进入 /usr/local/…

适合中学生看的英文电影

怎样利用好丰富的资源来学习英语口语呢&#xff1f;其实其实看什么样的剧、如何看剧都是很讲究的。一起来解锁吧。 一、选剧要学会拆解自己学习目标&#xff0c;选定合适的类型&#xff0c;各取所需。 并不是所有类型的国外影视剧都适合作为学习的素材&#xff0c;主要依据自身…

Python Pyecharts柱状横向动态图-全球GDP比较

程序示例精选 Python Pyecharts柱状横向动态图 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Python Pyecharts柱状横向动态图>>编写代码&#xff0c;主要功能包括了数据导入&am…

新年新气象----2022年度总结

年度总计——2.0 今年的时间很快飞一般的速度&#xff0c;回顾自己这一年中的日子&#xff0c;不知不觉就结束了&#xff0c;今年确确实实有太多的遗憾&#xff0c;太多的失落和不如意。也让我明白要是这样&#xff0c;就不会那样的道理。 回顾自己去年所定的目标&#xff0c;不…

Spring学习笔记

没有Spring的时候我们如何进行开发的&#xff1f; 没有Spring为我们服务的&#xff0c;写代码一定是这样的 调用层&#xff1a; public static void main(String[] args) {//创建视图层对象TestController testController new TestController();//调用视图层方法testControl…

一篇深入理解MySQL索引底层数据结构与算法

索引的定义 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构有&#xff1a;二叉树&#xff0c;红黑树&#xff0c;Hash表&#xff0c;B-Tree&#xff0c;BTree 对于数据库表的InndB索引来说&#xff0c;底层即是BTree数据结构 B-Tree (1) 叶子节点具有相同的深…

生物化学 实验记录或传闻 简述(暂记)

今天是2023年的1月1日&#xff0c;2022年是疫情肆虐的一年&#xff0c;由于疫情的叨扰&#xff0c;我在22年的最后一个月博客更新停滞了许久&#xff0c;这同时引发了我对一些医学方面的问题的观察&#xff0c;所以我准备在“力学地球物理科学化学”专栏的生物化学部分新增一个…

opencv--颜色识别

目录 一、主要函数介绍 二、颜色识别 三、其他相关函数介绍 1. cv2.resize 2. np.array(x,dtype) 3. cv2.inRange() 4. cv2.imshow() 5.cv2. waitKey() 四、掩膜 一、主要函数介绍 通常&#xff0c;相机在RGB颜色模式下工作&#xff0c;但这种模式受到光线的影响较大&am…

2022年终总结-知识沉淀、疫情、展望未来

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61…

GIS算法

目录 简介 GIS标准简介 空间数据模型 3.1 WKT与GeoJSON 3.2 WKB格式 GIS算法三方包 简介 地理信息系统(简称GIS),以数字化的形式反映人类社会赖以生存的地球空间的现势和变迁的各种空间数据以及描述这些空间数据特征的属性,支持空间数据及其属性数据的输入/输出,存储,显…

postgresql数据库主备安装,备份还原

一.postgresql数据库安装 1.下载软件包 地址&#xff1a;PostgreSQL: File Browser 2.解压安装 [rootpostgresql u01]# tar -zxf postgresql-14.2.tar.gz安装环境 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel op…