哇哦,一个超级牛逼的图片格式!!使用它之后我们系统加载图片快了一倍!!! 图片格式转换webp学习!

什么是webp格式?

WebP 格式是一种图像文件格式。

它是由谷歌开发的,旨在提供一种高效的图像压缩方式,同时保持较好的图像质量。WebP 格式具有较小的文件体积,能够在一定程度上减少网络传输的数据量,提升网页加载速度。它支持有损压缩和无损压缩两种模式。

为什么要用webp格式?

  1. 减小文件大小
  2. 能显著降低图片文件的体积,节省存储空间。
  3. 减少网络传输的数据量,降低服务器的带宽压力。
  4. 提升加载效率
  5. 更快的加载速度可以改善用户体验。
  6. 快速加载的图片能让用户在浏览时感觉更流畅。
  7. 保持较好质量
  8. 在压缩过程中能较好地保留图像的细节和质量。

话不多说,上代码

首先 spring 三板斧

引入依赖:

因为webp在java中并没有上传到maven中央仓库,只能通过jar手动上传。点我下载文件

手动依赖方案:

<!--        图片格式转换为webp-->
<dependency><groupId>com.github.nintha</groupId><artifactId>webp-imageio-core</artifactId><version>0.1.3</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/libs/webp-imageio-core-0.1.3.jar</systemPath>
</dependency>

FileUtils

package cn.ideamake.file.common.utils;import cn.hutool.core.io.FileTypeUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.stream.StreamUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.ideamake.file.aop.MockMultipartFile;
import com.luciad.imageio.webp.WebPWriteParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.Date;
import java.util.UUID;@Slf4j
public class FileUtils {/*** 图片文件类型转换为webp格式* @return webp图片*/public static File imagesToWebp(File file){try {String fileType = FileTypeUtil.getType(file);String outputWebpPath;if (!StrUtil.equalsAny(fileType, "jpg", "png", "jpeg")) {return null;}outputWebpPath = "/tmp/" + RandomUtil.randomString(32) + ".webp";// Obtain an image to encode from somewhereBufferedImage image = ImageIO.read(file);// Obtain a WebP ImageWriter instanceImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();// Configure encoding parametersWebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());writeParam.setCompressionMode(WebPWriteParam.MODE_DEFAULT);// Configure the output on the ImageWriterwriter.setOutput(new FileImageOutputStream(new File(outputWebpPath)));// Encodewriter.write(null, new IIOImage(image, null, null), writeParam);return new File(outputWebpPath);} catch (Exception e) {log.error("上传失败", e);return null;}}public static MultipartFile imagesToWebp(MultipartFile multipartFile) throws IOException {File tmpFile = multipartFileToFile(multipartFile, "/tmp/multipartFileToFile", RandomUtil.randomString(32) + "." + FileUtil.getSuffix(multipartFile.getOriginalFilename()));File file = imagesToWebp(tmpFile);return file == null ? multipartFile : new MockMultipartFile(file.getName(), FileUtil.getInputStream(file));}/*** MultipartFile类型文件转File* @return File类型文件*/private static File multipartFileToFile(MultipartFile multipartFile, String filePath, String fileName){File f = null;File dir = new File(filePath);if (!dir.exists() && !dir.isDirectory()) {dir.mkdirs();}if(multipartFile.getSize() <= 0){multipartFile = null;} else {try {InputStream ins = multipartFile.getInputStream();f = new File(filePath + fileName);OutputStream os = Files.newOutputStream(f.toPath());int bytesRead = 0;byte[] buffer = new byte[8192];while ((bytesRead = ins.read(buffer, 0, 8192)) != -1){os.write(buffer, 0, bytesRead);}os.close();ins.close();} catch (IOException e) {log.error("转换file文件失败:{}", e);}}return f;}public static byte[] imagesToWebp(byte[] bytes, String fileName){File file = imagesToWebp(FileUtil.writeBytes(bytes, "/tmp/multipartFileToFile/" + fileName));return file == null ? bytes : FileUtil.readBytes(file);}}

方法可自行重载扩展。

需要返回 MultipartFile 文件格式康我 MockMultipartFile 类

/** Copyright 2002-2018 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package cn.ideamake.file.aop;import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** Mock implementation of the {@link MultipartFile}* interface.**/
public class MockMultipartFile implements MultipartFile {private final String name;private final String originalFilename;@Nullableprivate final String contentType;private final byte[] content;/*** Create a new MockMultipartFile with the given content.* @param name the name of the file* @param content the content of the file*/public MockMultipartFile(String name, @Nullable byte[] content) {this(name, name, null, content);}/*** Create a new MockMultipartFile with the given content.* @param name the name of the file* @param contentStream the content of the file as stream* @throws IOException if reading from the stream failed*/public MockMultipartFile(String name, InputStream contentStream) throws IOException {this(name, name, null, FileCopyUtils.copyToByteArray(contentStream));}/*** Create a new MockMultipartFile with the given content.* @param name the name of the file* @param originalFilename the original filename (as on the client's machine)* @param contentType the content type (if known)* @param content the content of the file*/public MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, @Nullable byte[] content) {Assert.hasLength(name, "Name must not be null");this.name = name;this.originalFilename = (originalFilename != null ? originalFilename : "");this.contentType = contentType;this.content = (content != null ? content : new byte[0]);}/*** Create a new MockMultipartFile with the given content.* @param name the name of the file* @param originalFilename the original filename (as on the client's machine)* @param contentType the content type (if known)* @param contentStream the content of the file as stream* @throws IOException if reading from the stream failed*/public MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream)throws IOException {this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream));}@Overridepublic String getName() {return this.name;}@Overridepublic String getOriginalFilename() {return this.originalFilename;}@Override@Nullablepublic String getContentType() {return this.contentType;}@Overridepublic boolean isEmpty() {return (this.content.length == 0);}@Overridepublic long getSize() {return this.content.length;}@Overridepublic byte[] getBytes() {return this.content;}@Overridepublic InputStream getInputStream() {return new ByteArrayInputStream(this.content);}@Overridepublic void transferTo(File dest) throws IOException, IllegalStateException {FileCopyUtils.copy(this.content, dest);}}

效果展示:

图片展示

webp

image

jpg

image

大小展示

webp

image

jpg

image

压缩了50% 而且还能保质保证图片效果!

本文到此结束啦,希望对你有所帮助!如果害怕下次找不到笔者关注点一点!

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

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

相关文章

数据链路层之 以太网协议

以太网协议 这个协议即规定了数据链路层&#xff0c;同时也规定了物理层的内容。平时使用到的网线&#xff0c;其实也叫做“以太网线”&#xff08;遵守以太网协议的网线&#xff09;。 以太网帧格式 以太网数据帧 帧头 载荷 帧尾。 帧头&#xff1a;目的地址、源地址、类型…

SpringMVC传递参数

1.RequestMapping RequestMapping本身可以处理&#xff0c;get或post,指定了get或post之后&#xff0c;就只能处理对应的请求。 RequestMapping(value{"haihiyo","goodMoring"},methodRequestMethod.POST)2.RestFul风格 RestFul是一种风格 比如:网站的访…

人脸可调色美颜SDK解决方案,让妆容更加自然、真实

在追求个性化和差异化的美妆时代&#xff0c;美摄科技以其前沿技术&#xff0c;为企业带来了一场美妆革新的风暴。我们全新推出的人脸可调色美颜SDK解决方案&#xff0c;将为您提供前所未有的美妆体验&#xff0c;让每一位用户都能轻松打造属于自己的独特妆容。 可调色技术&am…

护肤升级:如何选择最适合您的AI皮肤技术解决方案?

在不断变化的护肤行业中&#xff0c;人工智能技术的整合已经彻底改变了企业满足个人护肤需求的方式。了解人工智能在美容行业的重要性以及提供的解决方案&#xff0c;是选择最合适的解决方案至关重要的。领先的主要参与者之一是玩美移动&#xff0c;他们提供了一套全面的AI皮肤…

有了这张“表”,印章什么情况契约锁帮您一查便知

随着电子签章的普及&#xff0c;企业法人、印章管理员最关心的问题就是“印章现在怎么样了”。等人汇报不仅存在时差、整理起来工作量大、数据精准性也没法保证… 契约锁推出“印章数据看板”&#xff0c;帮您连接各类业务软件&#xff0c;将所有真实印章操作数据自动沉淀下来&…

武汉星起航:五对一精细化服务助力合作伙伴开启亚马逊新篇章

武汉星起航电子商务有限公司以其专业的服务和独特的模式&#xff0c;为合作伙伴在亚马逊自营领域开拓了一片新天地。自2017年专注于亚马逊自营以来&#xff0c;武汉星起航不仅积累了丰富的经验&#xff0c;更在2020年成立了武汉星起航电子商务有限公司&#xff0c;进一步提升了…

Python深度学习基于Tensorflow(8)自然语言处理基础

RNN 模型 与前后顺序有关的数据称为序列数据&#xff0c;对于序列数据&#xff0c;我们可以使用循环神经网络进行处理&#xff0c;循环神经网络RNN已经成功的运用于自然语言处理&#xff0c;语音识别&#xff0c;图像标注&#xff0c;机器翻译等众多时序问题&#xff1b;RNN模…

k8s 使用Docker和Containerd对比分析

目录 k8s 使用Docker和Containerd对比分析 互动1&#xff1a;docker build构建的镜像和containerd镜像通用吗&#xff1f; 互动2&#xff1a;k8s1.24之前版本和1.24及1.24之后版本区别&#xff1f; k8s 使用Docker和Containerd对比分析 如果你使用Docker作为K8S容器运行时的…

企业内外网隔离后的文件传输解决方案

一、企业为什么要进行内外网隔离 在当今信息化快速发展的时代&#xff0c;企业内部网络的构建和管理显得尤为重要。为了更好地保护企业信息安全和提高工作效率&#xff0c;许多企业选择将网络划分为内网和外网。那么&#xff0c;企业划分内外网的作用具体体现在哪些方面呢&…

图片批量高效美化,轻松为图片进行消浊美化,让图片焕然一新

图片已经成为我们传递信息、表达情感的重要媒介。无论是社交媒体的分享&#xff0c;还是工作文档的展示&#xff0c;精美的图片总能吸引更多人的目光。然而&#xff0c;对于许多人来说&#xff0c;图片的美化却是一个令人头疼的问题。一张张手动调整&#xff0c;既耗时又费力&a…

数学AI解题软件有哪些?一分钟分享4款工具

数学AI解题软件有哪些&#xff1f;数学AI解题软件在现代教育中扮演着越来越重要的角色&#xff0c;它们不仅为学生提供了前所未有的解题速度和准确性&#xff0c;还通过个性化的学习建议和资源推荐&#xff0c;促进了学生的自主学习和深度学习。这些软件不仅提高了教育效率&…

Django开发实战之单元测试和集成测试之依赖包的安装

测试有哪些功能&#xff1a; 验证功能质量控制重构基础回归基础 1、安装依赖 pdm add -d black isort flake8 pytest pytest-django pytest-coverage使用依赖 在使用flake8时&#xff0c;需要把venv排除&#xff0c;这里是通过添加配置文件来进行管理&#xff0c;所以接下来…

企业必备:加密软件如何保障商业数据安全

在数字化时代&#xff0c;商业数据安全已成为企业运营中不可忽视的一环。在这个信息爆炸的时代&#xff0c;企业面临着诸多安全威胁&#xff0c;如数据泄露、黑客攻击等。因此&#xff0c;如何有效保障商业数据安全成为了每个企业都必须面对和解决的问题。而加密软件&#xff0…

webstorm 常用插件

安装插件步骤&#xff1a; 打开软件&#xff0c;文件 -- 设置-- 插件 -- 输入插件名称 -- 安装 代码截图: code screenShots 先选中代码&#xff0c;按 ctrl shift alt a&#xff0c;就可截取选中的代码颜色注释: comments highlighter 对注释的文字改变颜色高亮成对符号: h…

新一代多模态合规分析平台,炼就服务洞察火眼金睛

得益于5G技术的深入应用和大模型技术的持续创新&#xff0c;企业与客户间的沟通方式已从单一的语音交流拓展到视频通话、内容共享等多模态互动。 这种通话形式的演变&#xff0c;极大地丰富了沟通手段&#xff0c;并为企业提供了更多洞察客户需求、提供精准服务的机遇。 与此…

上海AI Lab开源首个可替代GPT-4V的多模态大模型

与开源和闭源模型相比&#xff0c;InternVL 1.5 在 OCR、多模态、数学和多轮对话等 18 个基准测试中的 8 个中取得了最先进的结果。 上海AI Lab 推出的 InternVL 1.5 是一款开源的多模态大语言模型 (MLLM)&#xff0c;旨在弥合开源模型和专有商业模型在多模态理解方面的能力差距…

【智能算法应用】麻雀搜索算法求解非线性方程组问题

目录 1.算法原理2.数学模型3.结果展示4.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.数学模型 非线性方程组为&#xff1a; 2 x 1 − x 2 e − x 1 − x 1 2 x 2 e − x 2 (1) \begin{aligned}&2x_1-x_2e^{-x_1}\\&-…

基于机器学习的学生学习行为自主评价设计与实现

管理员功能&#xff1a; a)学生学习数据管理&#xff1a;可查看学生学习的详情&#xff0c;编辑学生学习的内容&#xff0c;删除和添加学生学习&#xff0c;设置学生学习库存。 b)角色管理&#xff1a;增加删除学生用户&#xff0c;分配学生用户权限&#xff0c;查看学生用户…

油猴脚本:BOSS候选人简历工作履历时间自动计算显示

BOSS的候选人工作履历时间不计算&#xff0c;不符合我的查看习惯&#xff0c;很容易让那种经常跳槽的人简历通过&#xff0c;容易遗漏&#xff0c;特编写此程序! 使用前&#xff1a;使用后&#xff1a; 代码如下&#xff1a; // UserScript // name BOSS网页版辅助器…

马蹄集oj赛(双周赛第二十六次)

目录 斐波那契数列的组合 三国杀 数列分段 小码哥的跳棋游戏新编 能量供应 小码哥爱数字 最小串 小船过河 摘果子 泼墨淋漓 很重的枪 小码哥的布阵指挥 斐波那契数列的组合 #include<bits/stdc.h> using namespace std;// 斐波那契数列 1 1 2 3 5 8 13 21 34…