在当今的数字化时代,图片已成为网站、应用和社交媒体中不可或缺的元素。然而,大尺寸的图片不仅会增加页面或者客户端加载时间,还会占用大量的存储空间。为了解决这个问题,可以使用图片压缩工具来减小图片的尺寸,然后再将压缩后的图片上传至对象存储服务(如阿里云OSS)。本文将详细介绍如何利用Tinify压缩图片,并将其上传至OSS,重点介绍图片压缩实现方式。
随着互联网的普及,图片已成为信息传递的重要载体。然而,大尺寸、高分辨率的图片会占用大量带宽和存储空间,导致网站加载速度变慢。通过压缩图片,可以有效减小文件大小,提高网站性能。
Tinify是一个基于云的图片压缩服务,它能够显著减小图片的文件大小,同时保持图片的高质量。Tin义提供了丰富的API,可以轻松集成到各种项目中。而且还是对外免费开放使用的。
Tinify提供了两种主要的图片压缩方式:
直接获取表单请求的MultipartFile文件,也就是可以从缓冲区(带二进制字符串)上传图像,并获取压缩的图像数据。
byte[] sourceData = Files.readAllBytes(Paths.get("unoptimized.jpg"));
byte[] resultData = Tinify.fromBuffer(sourceData).toBuffer();
这种适合OSS上传,推荐,缺点是会先把压缩之后的图片保存到服务器,在上传到oss,可以在上传之后,删除图片。
只需可以提供一个URL到您的图像,而不必上传它,这种更适合图片查询展示的时候进行压缩,压缩之后可以在Source对象中获取新的图片URL。
Source source = Tinify.fromUrl("https://cdn.tinypng.com/images/panda-happy.png");
source.toFile("optimized.jpg");
阿里云OSS(Object Storage Service)是一种海量、安全、低成本、高可靠的云存储服务。用户可以通过RESTful API在任何时间、任何地点、以任何互联网设备访问OSS上的数据。OSS提供了丰富的功能,如文件上传、下载、删除、共享等,非常适合用于存储和管理图片。这里就不多介绍了,只要做过图片上传,相信大家都知道。
通过上面Tinify压缩API的介绍,可以看到使用Tinify进行图片压缩也是比较容易整合的,只要在上传OSS前对图片进行压缩,在获取压缩后最新图片进行上传,对原有代码改造也不多。具体流程如下:
判断上传的图片文件大小是否超过500KB。如果未超过,则不进行压缩,这一块可以根据自己业务进行处理。
使用Tinify.setKey(API_KEY)方法设置Tinify的API密钥。
使用Tinify.fromBuffer(file.getBytes())方法从文件字节流创建Tinify的Source对象。
使用source.toFile(file.getOriginalFilename())方法将压缩后的图片保存到服务器。
读取服务器中压缩后的图片输入流,并将其转换为MultipartFile对象。
删除服务器上临时保存的压缩源文件。
完整实现流程图如下:
首先,需要在项目中引入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>
在使用Tinify之前,需要先注册一个账号并获取API密钥,主要是获取对应的apiKey,这里可以到官网直接申请。
public class TinifyConfig {
public static final String API_KEY = "your_tinify_api_key";
}
以下是实现图片压缩和上传至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;
}
}
程序运行之后,查看日志,可以对比压缩前后图片大小,可以看到4M图片压缩之后变成了1M。
或者直接对比压缩前后两张图片的大小,更加直观说明。
原图片:
压缩之后图片:
通过本文的介绍,了解了如何利用Tinify压缩图片,并将其上传至阿里云OSS。这种方法不仅可以减小图片的文件大小,提高页面加载速度,还可以节省存储空间。希望本文的内容对有所帮助,能够优化Web应用中的图片管理。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。