我最近一直在使用尖锐的库在节点中进行图像处理,并让我的服务返回新图像的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
答案 0 :(得分:2)