我有一个应用程序,应该从大图像中创建缩略图。所以我需要压缩图像,为此我使用了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;
});
});
});
请注意,在这段代码中,我正在读取一个.txt文件,该文件的base64一个图像的字符串,然后我将其转换为二进制,这样我就可以使用它在imagemin函数中。这只是为了测试,在现实中base64字符串将由用户提供并发送到服务器通过POST请求。
对此有什么想法吗?
我根本不喜欢imagemin,如果有人指出更好的方法,我可以使用另一种解决方案。我所想做的就是尽可能多地压缩图像,而不会使其无法识别,这样我就可以创建将在博客中使用的缩略图"posts catalog";。
当然,只需将Buffer.from(data, 'base64')
的结果作为参数传递给imagemin.buffer(result,
。确保数据只是base64数据本身,不包括元数据,即"data:image/png;base64,"
Yup在imageminMozjpeg插件的帮助下,我可以将以下的示例代码的大小减少1/10
import imagemin from "imagemin";
import imageminMozjpeg from "imagemin-mozjpeg";
const ogBuffer = Buffer.from(base64String, "base64");
const buffer = await imagemin.buffer(ogBuffer, {
plugins: [imageminMozjpeg({ quality: 50 })],
});