我有一个应该从大图像创建缩略图的应用程序。所以我需要压缩图像,为此我使用包imagemin。
我从用户那里得到一个 base64 字符串的输入,然后在我的服务器上,我使用 Buffer.from( base64string , "base64") 对其进行转换。
问题是imagemin的输出根本没有被压缩。没有错误被抛出,但图像没有被压缩。尽管当我传递未触及的二进制数据(例如来自 image.jpg 文件)时它工作得很好,但似乎无法使用从base64 字符串转换的二进制数据。
我的代码:
const imagemin = require("imagemin");
const imageminJpegtran = require("imagemin-jpegtran");
const imageminMozjpeg = require("imagemin-mozjpeg");
const imageminPngquant = require("imagemin-pngquant");
const fs = require("fs");
const myPic = () => {
return new Promise((resolve, reject) => {
fs.readFile("/image.txt", (err, data) => {
if (err) throw err;
resolve(Buffer.from(data, "base64"));
});
});
};
const waitMyPic = async () => {
const picBuff = await myPic();
return picBuff;
};
waitMyPic().then((res) => {
console.log("Original File Size: " + Math.round(res.length / 1024));
const compressImg = async (res) => {
const files = await imagemin.buffer(res, {
plugins: [
imageminJpegtran(),
imageminMozjpeg({
quality: [10],
}),
imageminPngquant({ quality: [0.1, 0.12] }),
],
});
return files;
};
compressImg(res).then((data) => {
console.log("Compressed File Size: " + Math.round(res.length / 1024));
fs.writeFile("/image2.txt", data, (err, data) => {
if (err) throw err;
});
});
});
请注意,在这段代码中,我正在读取一个包含图像的 base64 字符串的 .txt 文件,然后将其转换为二进制文件,以便可以在imagemin函数中使用它。这仅用于测试,在实际情况下,base64 字符串将由用户提供并通过 POST 请求发送到服务器。
对此有什么想法吗?
我根本不喜欢imagemin,如果有人指出更好的方法,我可以使用另一种解决方案。我要做的就是尽可能多地压缩图像而不使其无法识别,因此我可以创建将在博客“帖子目录”中使用的缩略图。