如何将 base64 字符串格式的图像转换为清晰图像缩小器期望的数据类型?

Posted

技术标签:

【中文标题】如何将 base64 字符串格式的图像转换为清晰图像缩小器期望的数据类型?【英文标题】:How do I convert a base64 string formatted image to the datatype sharp image downsizer expects? 【发布时间】:2017-09-21 08:59:12 【问题描述】:

我正在尝试对节点中的图像进行下采样。我将该图像存储为 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`) );
    

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

【问题讨论】:

换句话说就是一个缓冲区 【参考方案1】:

试试这个?

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

【讨论】:

从节点 6 开始,不推荐使用带有 Buffer 的构造函数【参考方案2】:

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

不久前我还在为此苦苦挣扎……

【讨论】:

以上是关于如何将 base64 字符串格式的图像转换为清晰图像缩小器期望的数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

将图像(按路径选择)转换为 base64 字符串

Python 对图像进行base64编码及解码读取为numpyopencvmatplot需要的格式

使用 AngularJs 将 base64 格式的数据转换为图像

如何将图像转换为 Base64 字符串,并转换回图像,保存到 azure blob

如何在 PHP 中将图像从 base 64 转换为它们的文件类型?

如何将图像的字节数组转换为表示 jpg 的 base64 编码字符串