C++ 将 PNG 转换成 base64

5

我发现将png文件转换为base64,但需要像这样从文件流中读取:

ostringstream sout;
istringstream sin;

// this is the object we will use to do the base64 encoding
base64 base64_coder;



// now base64 encode the compressed data
base64_coder.encode(sin,sout);

我在OpenCV中有一个PNG格式的图像,转换为:

                imencode(".png", im, buf);

当我想要转换时,
    base64_coder.encode(buf,sout);

这里涉及到it技术。

我对c ++的了解有限,因此需要任何帮助。

目的是:

我需要将png图像写入mongodb,以便meteorjs使用。因此,它们要求图像为base64编码。

谢谢

编辑:im为Cv :: Mat . obj。我正在将其转换为png。buf包含png。


2
什么是im,什么是buf?你需要展示一个带有错误信息的完整示例。 - aram
您可以使用GridFS或CollectionFS将图像存储在MongoDB中,这样您就不需要将它们转换为base64。 - Jankapunkt
im 是 cv::mat,将其转换为 png 格式并存储在 buf 中。 - Rahibe Meryem
请检查Nyffenegger的b64解码/编码实现,它使用char *(我假设您的缓冲区是这样的),而不是流,并返回std :: string。我曾经用类似的方法将图片存储在mongodb中 :) - aram
3个回答

3

我的经验是:

最初的回答:

  • Added .cpp and .h files from https://github.com/ReneNyffenegger/cpp-base64 to my project;

    string encoded_png;
    Mat img; // Load an image here
    
    vector<uchar> buf;
    cv::imencode(".png", img, buf);
    auto base64_png = reinterpret_cast<const unsigned char*>(buf.data());
    encoded_png = "data:image/jpeg;base64," + base64_encode(base64_png, buf.size());
    

现在,encoded_png包含了Base64字符串,可以解码得到原始图像。


0

我找到了:

auto base64_png = reinterpret_cast<const unsigned char*>(buf.data());
                std::string encoded_png = "data:image/jpeg;base64,"+base64_encode(base64_png,buf.size());

github中的头部信息:

这解决了我的问题。


0
虽然这两种方法都是可行的,但值得注意的是,在将图像编码为base64时,大小会增加约33%,详细信息请参考Stack Overflow answer。如果存储或传输效率是一个问题,请考虑在base64编码之前对PNG图像进行压缩。
解决这个问题的一个选择是使用png-base64-webp头文件库。它通过WebP压缩将PNG图像编码为base64,优化了空间使用。然而,请注意解码后将得到一个WebP图像而不是PNG图像。如果主要目标是图像检索和显示,鉴于WebP在各种浏览器和平台上的广泛支持,这可能不是一个问题。
要使用该库,请包含头文件并调用encodePNGToBase64函数:
#include "png-base64-webp.h"

int main() {
    const char* imagePath = "/path/to/your/image.png";
    char* encodedData = encodePNGToBase64(imagePath);
    if (encodedData) {
        // Utilize the encoded data
        free(encodedData);  // Ensure to release the memory post usage
    }
    return 0;
}

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