2017-09-28 30 views
0

我最近在使用锐库的节点中进行图像处理,让我的服务返回新图像的base64编码。我的问题似乎很简单:base64编码图像总是以==结尾?如果不是,处理jpeg/png有什么区别?我的理解是,无论格式如何,编码都应该是相同的,但是这使我想不到。在测试期间,我决定进行单元测试,以验证我的响应(base64映像)的主体是否以=结尾。 我发现的是,如果我通过使用sharp.max()调整大小但不保留比例来裁剪图像,测试将通过。如果我放弃这一点,并调整到任何我喜欢的高度/宽度参数,测试将失败。值得注意的是,这种行为仅限于png,而不是jpeg。什么时候base64编码的PNG图像不以'='结尾

这里是我的尺寸功能:

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

回答