如何将一个以base64格式编码的图片转换为sharp image downsizer所期望的数据类型?

22

我正在尝试在Node中对图像进行降采样。我将该图像存储为base64编码字符串(例如:“data:image/png;base64,iVBOR”等)。我正在使用Sharp npm包。文档似乎表明sharp可以接受图像的文件路径或“inputBuffer”。我做了一些搜索,认为他们所指的是Buffer类。我尝试了下面的代码和其他代码,但一直收到以下错误消息:“输入缓冲区包含不受支持的图像格式。”我的问题可能是什么?如果您不确定,您能否请推荐另一个具有更清晰文档的npm包?

 const downsizeProfileImgForTweet = (user, cb) => {
        let imgBuffer =  Buffer.from(user.profileImg, 'base64');
        sharp(imgBuffer)
        .resize(52, 52)
        .toBuffer()
        .then(data => {
            console.log("success");
            user.profileImg = data;
            cb()
        } )
        .catch( err => console.log(`downisze issue ${err}`) );
    }

我在网上搜遍了所有内容并进行了一些尝试,所以请原谅我这个新手的问题。非常感谢您提供的任何帮助!


换句话说,将内容存入缓冲区 - stckoverflowaccnt12
2个回答

21

您需要删除"data:image/png;base64"这部分。

所以,这里是:

const uri = user.profileImg.split(';base64,').pop()
const downsizeProfileImgForTweet = (user, cb) => {
    let imgBuffer = Buffer.from(uri, 'base64');
    sharp(imgBuffer)
    .resize(52, 52)
    .toBuffer()
    .then(data => {
        console.log('success')
        user.profileImg = data
        cb()
    })
    .catch(err => console.log(`downisze issue ${err}`))
}

虽然我不确定它是否适用于“.toBuffer()”方法,但对我而言,它像这样工作(用于写入文件):

sharp(imgBuffer)
    .resize(1920, null)
    .toFile(`${config.images_path}/${picture.filename}`)
    .then(data => {
        console.log('normal: ', data)
    })
    .catch(err => console.log(`downisze issue ${err}`))

不久前我也曾为此苦苦挣扎...


1

你可以试一下这个吗?

const buf = new Buffer(img.replace(/^data:image\/\w+;base64,/, ""),'base64')


4
自从Node 6版本开始,使用带有Buffer的构造函数已被弃用。 - EmmanuelBeziat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接