我正在尝试使用node-canvas裁剪背景图片,而且我遇到了一些奇怪的错误,使用以下代码。
错误是“[错误:写入输出流时出错]”。如果我使用node-canvas repo中的crop示例代码,我会收到此错误“Empty JPEG image(DNL not supported)”
/* */
var cnv = new Canvas(w,h),
ctx = cnv.getContext('2d'),
original = '/img/pages/'+page+'/background.jpg';
ctx.imageSmoothingEnabled = true;
fs.readFile('public/'+original, function( err,image){
if (err) {
res.status(404)
.send('Not found');
}
else {
var
img = new Image;
img.src = image;
ctx.drawImage(img,
Math.abs( (w-img.width)/2),0,
w,h,
0,0,
w,h
);
cnv.toBuffer(function(err, buf){
console.log(err);
if( err){
res.status(500)
.send('Error generating image buffer');
}
else {
fs.writeFile('public'+resampled, buf, function(err){
console.log(err);
console.log('Resized and saved in %dms', new Date - start);
returnResampledFile( res,page,w,h);
});
}
});
}
});
我已经多次使用node-canvas而没有任何问题但是出于某种原因这是一个问题。任何建议都会很棒。
答案 0 :(得分:3)
libjpeg
(可能在引擎盖下使用)不支持JPEG文件中的DNL标记(see this document, towards the end, for an explanation)。包含此类标记的文件将声明为零高度(因此Empty JPEG image
消息)。我的猜测是你的输入文件使用这样的标记,触发错误。
至于解决方案:尝试找一个能够读取这些类型文件的JPEG阅读器,并将它们转换回libjpeg可以处理的内容。我恐怕不能推荐任何东西,因为我自己从未遇到过这个问题。