В последнее время я много работал с манипуляциями с изображениями в узле с использованием библиотеки 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