我在使用 imagemagick 处理图像时遇到问题,然后将其上传到 S3。生成的对象具有不同(更大)的大小,并且似乎已损坏。如果我做了一个中间步骤并首先将输出保存到本地 tmp 文件并读回,然后上传结果一切似乎都很好。这是不起作用的代码。
im.resize({
srcData: imageObject.Body,
width: variant.width,
height: variant.height,
customArgs: ['-auto-orient']
}, function(err, stdout, stderr) {
if (err) {
// This resize completed successfully
log.err('Failed calling imageMagick, bail out', err);
callback(err);
return;
}
var fileName = cfg.aws.s3.uploadDir +
photo.imageId + '/' +
variant.width + 'x' + variant.height + '.jpg';
log.info('Storing image at S3 ' + fileName);
//fs.writeFileSync('/tmp/xxx.jpg', stdout, 'binary');
//stdout = fs.readFileSync('/tmp/xxx.jpg');
var x = new Buffer(stdout);
console.log(x);
s3.putObject(
{
Bucket: cfg.aws.s3.bucket,
Key: fileName,
Body: x,
ContentType: 'image/jpeg',
ACL: 'public-read'
},
function(err, data) {
if (err) {
// Failed saving to S3
log.error('Failed saving to S3', err);
}
callback(err);
}
);
});
取消注释 fileWriteSync 和 fileReadSync 并且它可以正常工作。
console.log(x) 命令在两种情况下的输出: BAD:
缓冲区 c3 bf c3 98 c3 bf c3 a0 00 10 4a 46 49 46 00 01 01 01 00 01 00 01 00 00 c3 bf c3 9b 00 43 00 06 04 05 06 05 04 06 06 05 06 07 07 06a 08 09 09 ...>
好的:
缓冲区 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 01 00 01 00 00 ff db 00 43 00 06 04 05 06 05 04 06 06 05 06 07 07 06 08 0a 090 0a 14 0a 0c 10 ...>
正如您所看到的,好的一个是正确的 jpeg,坏的虽然包含类似的序列,如 4a 46 49 46 = JFIF,但是有些字节是关闭的,并且有移位,整个文件在坏的情况下大大约 20% .
与编码有关吗?我已经尝试了几件事,但此时我迷路了。
谢谢!
更新 #1: 显然它与 UTF 编码有关,但我仍然不完全理解在这种情况下会发生什么。显然 c3 bf c3 98 c3 bf c3 a0 00 10 4a 46 49 46 00 01 是 UTF 编码:
U+00FF LATIN SMALL LETTER Y WITH DIAERESIS character (ÿ)
U+00D8 LATIN CAPITAL LETTER O WITH STROKE character (Ø)
U+00FF LATIN SMALL LETTER Y WITH DIAERESIS character (ÿ)
U+00E0 LATIN SMALL LETTER A WITH GRAVE character (à)
U+0000 <control> character
U+0010 <control> character
U+004A LATIN CAPITAL LETTER J character
U+0046 LATIN CAPITAL LETTER F character
U+0049 LATIN CAPITAL LETTER I character
U+0046 LATIN CAPITAL LETTER F character
U+0000 <control> character
U+0001 <control> character
当 FF D8 FF .. 正是我所期待的。
我知道如何在没有临时文件的情况下使代码工作(将 var x = new Buffer(stdout);替换为 var x = new Buffer(stdout, 'binary'))
但是我仍然不能说我完全理解这里发生了什么,这应该没有 Buffer() 包装,哪个组件有问题?图像魔术师?缓冲?