请放弃使用JPEG、PNG、GIF格式的图片!
haoteby 2025-09-27 23:16 17 浏览
随着互联网的发展,图片作为最直观的内容展示方式逐渐在系统中占用越来越多的版面,但是随之而来的就是系统性能的大幅度下滑。传统的 JPEG、PNG、GIF 各有优点,也各有弊端,“大一统”的图片格式被需要,于是 WebP 诞生了。
需求
WebP 格式文件产生的原因主要是源于对 网络图像传输效率 的需求以及 现有图像格式在某些方面的局限性 。
在现代互联网网页中图片和视频占据了很大比例。为了提供更吸引人的用户体验,网站需要加载 大量的高质量图像 。
同时智能手机和平板电脑的普及推动了 移动互联网 的快速发展。在移动设备上,网络速度通常比桌面端慢,且用户的流量是有限的。
而 JPEG、PNG 和 GIF 等传统图像格式各有其优点 #技术分享,但也存在不足之处。
例如,JPEG 虽然非常适合照片,但仅支持有损压缩且不支持透明度;PNG 支持透明度但文件大小通常较大;GIF 支持动画但色彩范围有限,且文件体积相对较大。
产生
WebP 是一种由 Google 开发的图像文件格式,旨在提供更高效的图片压缩,适用于网络图像传输和展示。
- 高压缩效率 :WebP采用了先进的压缩算法,可以提供比JPEG更高的压缩率而不会明显损失图像质量。这意味着使用WebP格式可以在不牺牲视觉体验的情况下显著减少图片文件的大小,从而加快网页加载速度。
- 支持透明度 :与JPEG不同,WebP支持alpha通道(即透明度),这使得它在需要背景透明效果的应用场景中成为PNG的一个有力替代者,同时还能以更低的文件大小实现这一功能。
- 动画支持 :除了静态图像外,WebP还支持动画,作为一种更加有效的替代GIF的方案。相比GIF,WebP能够以更小的文件尺寸提供更高品质的动画效果和更多的色彩支持。
- 广泛兼容性 :虽然WebP最初由Google推出,但它逐渐获得了广泛的浏览器和其他平台的支持,包括Chrome、Firefox、Edge、Safari等主流浏览器,以及各种操作系统和图像处理软件。
局限
- 浏览器兼容性 :虽然大多数现代浏览器已经支持WebP格式,但仍有少数旧版浏览器可能不完全支持或根本不支持这种格式。在转换的同时也需要准备适当的回退方案(如提供JPEG或PNG版本的图像)。
- 性能问题 :尽管WebP通常能提供更好的压缩率和质量比,但在某些情况下,转换过程可能会增加服务器负载,尤其是在需要实时生成WebP图像的情况下。
- 特定需求和偏好 :一些网站可能基于设计、品牌或其他技术要求而选择特定的图像格式。例如,对于需要极高保真度的专业摄影展示,可能仍然倾向于使用TIFF或高质量JPEG格式。
使用
在线格式转换
- SO JSON 在线格式转换 www.sojson.com/image/forma…
- Convertio convertio.co/zh/image-co…
- ILoveImg www.iloveimg.com/zh-cn/featu…
- ALL TO ALL www.alltoall.net/
程序格式转换
Python:可以使用 Pillow 库(PIL 的一个分支)结合 webp 的支持来进行转换。
// 安装 pip install Pillow
from PIL import Image im = Image.open("input.png") im.save("output.webp", "WEBP")
也可以使用 Node.js 来转换。
这里使用 egg.js 作为服务端框架
前端
<template>
<div class="wrap">
<a-upload v-model:file-list="fileList" name="file" action="/api/uploadImg" :accept="['.jpeg','.png','.jpg','.gif']" @change="handleChange" >
<a-button>
上传文件 </a-button>
</a-upload>
<div class="diff-wrap">
<div class="old-img">
<img style="max-width: 400px;max-height: 500px;" :src="oldImg" alt=""/>
</div>
<div class="new-img">
<img style="max-width: 400px;max-height: 500px;" :src="newImg" alt=""/>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'; const oldImg = ref(''); const newImg = ref('');
const handleChange = info => { const file = info.file;
// 使用 FileReader 进行本地文件预览(无论上传是否成功) const reader = new FileReader(); reader.onload = () => { oldImg.value = reader.result; // 将本地文件的 Base64 赋值给 oldImg }; reader.readAsDataURL(file.originFileObj); // 读取原始文件对象
// 原有上传完成逻辑可保留用于处理服务器返回结果 if (file.status === 'done' && file.response) { console.log(file) newImg.value = file.response.url; // 如果上传成功,使用服务器返回的 URL } };
const fileList = ref([]); </script>
<style scoped>
.diff-wrap { width: 800px; margin: 20px auto; border: 1px solid #ddd; display: flex; }
.old-img { flex: 1; height: 500px; border-right: 1px solid #ddd; }
.new-img { flex: 1; height: 500px; } </style>
服务端
使用 Node.js 的图像处理库 sharp 进行格式转换,安装 sharp。
npm install sharp
示例代码
const { Service } = require('egg');
const fs = require('fs');
const path = require('path');
const sharp = require('sharp');
class HomeService extends Service { async index() { return 'hello world'; }
async uploadImg() { const { ctx } = this;
try { const stream = await ctx.getFileStream();
const allowedMimes = [ 'image/jpeg', 'image/png', 'image/gif', 'image/webp' ]; if (!allowedMimes.includes(stream.mime)) { throw new Error('Unsupported image format'); }
const tempInputPath = path.join(this.config.baseDir, 'app/public', `temp_${Date.now()}.tmp`); const outputFilename = `converted_${Date.now()}.webp`; const outputFilePath = path.join(this.config.baseDir, 'app/public', outputFilename);
const writeStream = fs.createWriteStream(tempInputPath); await new Promise((resolve, reject) => { stream.pipe(writeStream); stream.on('end', resolve); stream.on('error', reject); });
await sharp(tempInputPath) .webp({ quality: 80 }) .toFile(outputFilePath);
fs.unlinkSync(tempInputPath);
return { url: `/public/${outputFilename}`, filename: outputFilename, }; } catch (err) { ctx.logger.error('Image upload or conversion failed:', err); throw new Error('Image processing failed: ' + err.message); } } }
module.exports = HomeService;
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- k8s 证书问题排查_k8s dashboard 证书
-
从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...
- 企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战
-
企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...
- OpenV** Server/Client配置文件详解
-
Server配置详解...
- 接口基础认知:关键信息与合规前提
-
1.核心技术参数(必记)...
- S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)
-
说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...
- SSL证书如何去除私钥密码保护_ssl证书怎么取消
-
有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...
- SSL证书基础知识与自签名证书生成指南
-
一、证书文件类型解析...
- S交换机通过SSH登录设备配置示例(RADIUS认证)
-
说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- HTTPS TLS握手流程_进行tls握手
-
1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....
- Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt
-
SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...
- 源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- 微信支付商户API证书到期 怎么更换
-
微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...