0

我有一个应该从大图像创建缩略图的应用程序。所以我需要压缩图像,为此我使用包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,如果有人指出更好的方法,我可以使用另一种解决方案。我要做的就是尽可能多地压缩图像而不使其无法识别,因此我可以创建将在博客“帖子目录”中使用的缩略图。

4

2 回答 2

0

是的,借助 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 })],
});
于 2021-05-19T12:00:38.950 回答
0

当然只是将结果Buffer.from(data, 'base64')作为参数传递给imagemin.buffer(result, . 确保数据只是base64数据本身,不包括元数据,即"data:image/png;base64,"

于 2021-01-15T05:42:56.730 回答