引言
在当今的数字化时代,图片已成为网站、应用和社交媒体中不可或缺的元素。然而,大尺寸的图片不仅会增加页面或者客户端加载时间,还会占用大量的存储空间。为了解决这个问题,可以使用图片压缩工具来减小图片的尺寸,然后再将压缩后的图片上传至对象存储服务(如阿里云oss)。本文将详细介绍如何利用tinify压缩图片,并将其上传至oss,重点介绍图片压缩实现方式。
一、tinify简介
1.1 图片压缩的重要性
随着互联网的普及,图片已成为信息传递的重要载体。然而,大尺寸、高分辨率的图片会占用大量带宽和存储空间,导致网站加载速度变慢。通过压缩图片,可以有效减小文件大小,提高网站性能。
1.2 tinify概述
tinify是一个基于云的图片压缩服务,它能够显著减小图片的文件大小,同时保持图片的高质量。tin义提供了丰富的api,可以轻松集成到各种项目中。而且还是对外免费开放使用的。
1.3 tinify的使用方式
tinify提供了两种主要的图片压缩方式:
第一种:源文件直接上传
直接获取表单请求的multipartfile文件,也就是可以从缓冲区(带二进制字符串)上传图像,并获取压缩的图像数据。
byte[] sourcedata = files.readallbytes(paths.get("unoptimized.jpg")); byte[] resultdata = tinify.frombuffer(sourcedata).tobuffer();
这种适合oss上传,推荐,缺点是会先把压缩之后的图片保存到服务器,在上传到oss,可以在上传之后,删除图片。
第二种:图片url上传
只需可以提供一个url到您的图像,而不必上传它,这种更适合图片查询展示的时候进行压缩,压缩之后可以在source对象中获取新的图片url。
source source = tinify.fromurl("https://cdn.tinypng.com/images/panda-happy.png"); source.tofile("optimized.jpg");
二、oss简介
阿里云oss(object storage service)是一种海量、安全、低成本、高可靠的云存储服务。用户可以通过restful api在任何时间、任何地点、以任何互联网设备访问oss上的数据。oss提供了丰富的功能,如文件上传、下载、删除、共享等,非常适合用于存储和管理图片。这里就不多介绍了,只要做过图片上传,相信大家都知道。
三、实现流程
通过上面tinify压缩api的介绍,可以看到使用tinify进行图片压缩也是比较容易整合的,只要在上传oss前对图片进行压缩,在获取压缩后最新图片进行上传,对原有代码改造也不多。具体流程如下:
3.1 检查文件大小
判断上传的图片文件大小是否超过500kb。如果未超过,则不进行压缩,这一块可以根据自己业务进行处理。
3.2 设置tinify api密钥
使用tinify.setkey(api_key)方法设置tinify的api密钥。
3.3 压缩图片
使用tinify.frombuffer(file.getbytes())方法从文件字节流创建tinify的source对象。
使用source.tofile(file.getoriginalfilename())方法将压缩后的图片保存到服务器。
读取服务器中压缩后的图片输入流,并将其转换为multipartfile对象。
3.4 清理临时文件
删除服务器上临时保存的压缩源文件。
完整实现流程图如下:
四、实现代码
4.1 引入依赖
首先,需要在项目中引入tinify和阿里云oss的依赖。
<!-- tinify --> <dependency> <groupid>com.tinify</groupid> <artifactid>tinify</artifactid> <version>release</version> </dependency> <!-- 阿里云oss --> <dependency> <groupid>com.aliyun.oss</groupid> <artifactid>aliyun-sdk-oss</artifactid> <!-- 阿里云oss --> <dependency> <groupid>com.aliyun.oss</groupid> <artifactid>aliyun-sdk-oss</artifactid> <version>3.14.1</version> </dependency>
4.2 配置tinify api密钥
在使用tinify之前,需要先注册一个账号并获取api密钥,主要是获取对应的apikey,这里可以到官网直接申请。
public class tinifyconfig { public static final string api_key = "your_tinify_api_key"; }
4.3 实现图片压缩和上传功能
以下是实现图片压缩和上传至oss的核心代码:
import com.aliyun.oss.oss; import com.aliyun.oss.ossclientbuilder; import com.tinify.tinify; import org.springframework.web.multipart.multipartfile; import java.io.ioexception; import java.nio.file.files; import java.nio.file.paths; import java.util.uuid; public class imageuploader { private static final string dir = "your_upload_directory/"; /** * 图片上传 * * @param file 源文件 * @return 压缩后图片的url * @throws ioexception */ public string upload(multipartfile file) { string endpoint = ossclientconstants.endpointmap.get("lden"); oss ossclient = new ossclientbuilder().build(endpoint, ossclientconstants.access_key_id, ossclientconstants.access_key_secret); try { string name = file.getoriginalfilename(); string prefix = name.substring(name.lastindexof(".")); // 获取文件后缀 string filename = dir + uuid.randomuuid() + prefix; // 上传的文件路径和文件名 // 压缩图片 inputstream is = compresspic(file); // 上传阿里oss ossclient.putobject(bucket, filename, is); // 返回图片上传url return ("https://your_cdn/" + filename); } catch (exception e) { logger.error("上传发生错误", e); return null; } finally { ossclient.shutdown(); } } /** * tinify压缩图片 * * @param file 源文件 * @return 压缩图片流 * @throws ioexception */ public inputstream compresspic(multipartfile file) throws ioexception { inputstream is = file.getinputstream(); // 小于 500kb不压缩,这块业务可以自己决定 if (file.getsize() > 500 * 1024) { // 设置tinify的api密钥 tinify.setkey(tinifyconfig.api_key); // 从multipartfile创建tinify的source对象,压缩图片 source source = tinify.frombuffer(file.getbytes()); // 压缩之后保存到服务器 source.tofile(file.getoriginalfilename()); // 读取服务器中压缩图片输入流 byte[] bytes = files.readallbytes(paths.get(file.getoriginalfilename())); is = converttomultipartfile(bytes, file.getoriginalfilename()).getinputstream(); // 删除压缩源文件 files.deleteifexists(paths.get(file.getoriginalfilename())); } return is; } }
4.4 压缩效果验证
程序运行之后,查看日志,可以对比压缩前后图片大小,可以看到4m图片压缩之后变成了1m。
或者直接对比压缩前后两张图片的大小,更加直观说明。
原图片:
压缩之后图片:
4.5 注意事项
- api密钥安全:请确保tinify的api密钥和oss的访问密钥安全,不要泄露给他人,可以统一保存到安全的配置文件或数据库中。
- 异常处理:在实际应用中,需要对可能出现的异常进行详细处理,以确保程序的健壮性。
- 文件命名:为了避免文件名冲突,可以使用uuid生成唯一的文件名。
- 压缩图片删除:为了避免占用服务器内存,可以在压缩之后删除临时保存的压缩源文件。
五、总结
通过本文的介绍,了解了如何利用tinify压缩图片,并将其上传至阿里云oss。这种方法不仅可以减小图片的文件大小,提高页面加载速度,还可以节省存储空间。希望本文的内容对有所帮助,能够优化web应用中的图片管理。
以上就是java使用tinify实现图片无损压缩的方法的详细内容,更多关于java tinify图片压缩的资料请关注代码网其它相关文章!
发表评论