Когда изображение png с кодировкой base64 не оканчивается на '='

В последнее время я много работал с манипуляциями с изображениями в узле с использованием библиотеки Sharp, и моя служба возвращала кодировку 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 чтобы проверить, хорошее ли изображение, и я могу видеть, как оба генерируют изображения, как ожидалось, с правильным размером. Почему кадрированное изображение кодируется в base64, а не заканчивается на ==? В случае, если это будет полезно, вот острая библиотека, которую я использую: http://sharp.dimens.io/en/stable/api-resize/#max


person johnny_mac    schedule 28.09.2017    source источник


Ответы (1)


= в конце не является терминатором, это дополнение:

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

Итак, видите ли вы это или нет, зависит от размера в байтах объекта, который вы кодируете.

person jcupitt    schedule 02.10.2017