代码之家  ›  专栏  ›  技术社区  ›  johnny_mac

base64编码的png图像何时不以“=”结尾

  •  1
  • johnny_mac  · 技术社区  · 7 年前

    最近,我一直在使用sharp库在node中处理图像,并让我的服务返回新图像的base64编码。我的问题似乎很简单:base64编码的图像是否总是以 == ? 如果没有,在处理jpeg/png时有什么区别?我的理解是,无论格式如何,编码都应该是相同的,但这让我有了不同的想法。在测试期间,我决定进行一个单元测试,以验证我的响应主体(base64图像)是否以 = sharp.max() 调整大小但保持比例。如果我关闭这个选项并将其调整为我喜欢的任何高度/宽度参数,测试将失败。值得注意的是,这种行为仅限于png,而不是jpeg。

    这是我的调整大小功能:

    const sharp = require('sharp');
    const request = require('request');
    const bufferRequest = request.defaults({ encoding: null });
    
    function imgFormatter(url, args) {
        return new Promise((resolve, reject) => {
          bufferRequest.get(url, args, function (err, res, body) {
            let imgFormat = url.includes('png') ? 'png' : 'jpeg';
            let resized = (args.crop)
            ? sharp(body).resize(args.width, args.height)
            : sharp(body).resize(args.width, args.height).max()
            resized.toFormat(imgFormat)
            .toBuffer()
            .then((output) => {
              let newImage = "data:" + res.headers["content-type"] + ";base64," + new Buffer(output).toString('base64');
              console.log(newImage);
              resolve(newImage);
            })
            .catch((error) => {
              reject(error);
            })
          });
        })
    }
    

    data:image/jpeg;base64,/9j/.....RgX7p57pbYTvawQC580N4QcJtygGGgG/SLplthgBV2KCfCgIa3wWTVA3HySPmgP//Z
    

    以下是未裁剪的图像:

    data:image/jpeg;base64,/9j/.....4qUhXQD5S5HzQhAM8KRz80IQH//2Q==
    

    很抱歉,我的base64太大了,我不能在这里包含。我正在使用 https://codebeautify.org/base64-to-image-converter ? 如果有用,下面是我正在使用的sharp库: http://sharp.dimens.io/en/stable/api-resize/#max

    1 回复  |  直到 7 年前
        1
  •  4
  •   jcupitt    7 年前

    这个 = 结尾不是终结符,而是填充:

    https://en.wikipedia.org/wiki/Base64#Output_padding

    因此,您是否看到它取决于您正在编码的对象的大小(以字节为单位)。