0%

图床系列之tinypng自动压缩图片

前置内容:

R2的存储空间虽然很便宜,但图片尺寸仍然应该尽可能小,节约存储空间的同时也减少传输体积,节约加载时间。所以图片在上传前最好是能压缩一下。目前非常好用的压缩图片的工具网站是 tinypng,所以之前一般是手动去 tinypng 对图片进行压缩后再上传,但这样很麻烦,所以今天我们来加一步逻辑给自动处理。

第一步找 tinypng 的 API: https://tinypng.com/developers

是填写邮箱地址后它直接把控制台地址发到你的邮箱里。获取一个 API key 保管好。

第二步读文档:https://tinypng.com/developers/reference

太多字了不想读怎么办?打开 chatGPT 开始聊天。先告诉 chatGPT 我想在图片上传前通过 tinypng 的服务对图片进行压缩,我的服务是用 cloudflare 的 worker 编写的,图片存储在 R2 里,前端代码是用 solidjs 写的。

chatGPT 就给了我一堆代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const TINYPNG_API_KEY = '前面申请到的 API KEY'
export async function compressImage(file: File) {
const tinypngUrl = 'https://api.tinify.com/shrink';

const response = await fetch(tinypngUrl, {
method: 'POST',
headers: {
Authorization: 'Basic ' + btoa('api:' + TINYPNG_API_KEY),
'Content-Type': file.type,
},
body: file,
});

if (!response.ok) {
throw new Error('Error compressing image: ' + response.statusText);
}

const result = await response.json();
// @ts-ignore
const compressedImageUrl = result.output.url;

const compressedImageResponse = await fetch(compressedImageUrl);
if (!compressedImageResponse.ok) {
throw new Error(
'Error fetching compressed image: ' + compressedImageResponse.statusText,
);
}

return compressedImageResponse.arrayBuffer();
}

拿到的结果是一个 arrayBuffer,直接给到 OSS.put 方法即可(相关代码参考上一篇)。