15

我正在尝试对节点中的图像进行下采样。我将该图像存储为 base64 编码字符串(即:“data:image/png;base64,iVBOR”等)。我正在使用夏普 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}`) );
    }

我查看了整个互联网并做了一堆猜测和检查,所以请原谅我的菜鸟问题。提前感谢您提供的任何帮助!

4

2 回答 2

13

您需要删除“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}`))

不久前我还在为此苦苦挣扎……</p>

于 2018-08-21T23:26:46.930 回答
0

尝试这个?

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

于 2018-07-25T06:41:47.743 回答