如何将图像(BYTE *)转换为Base64

时间:2017-04-09 16:22:26

标签: c++ qt

我在imgBuffer中捕获了指纹图像。

BYTE *imgBuffer = new BYTE[m_ImageWidth*m_ImageHeight];
myObj->GetImage(imgBuffer);

将其转换为Base64。

int imgBufferSize = sizeof(imgBuffer) - 1;
QByteArray temp = QByteArray(*imgBuffer, imgBufferSize);
QByteArray base64Image = temp.toBase64();

但我得到的是这样的东西:

 BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==

我遵循了这个:How to convert an array into QByteArray?

修改 实际上,在实施雅各布的解决方案后,我得到了另一个Base64字符串,但那也不是一个图像。虽然雅各布的解决方案是正确的。问题是图像没有任何元数据。所以,我用以下程序解决了它:

QImage jpgImage((const unsigned char*)imgBuffer, m_ImageWidth, m_ImageHeight, QImage::Format_Grayscale8);

QByteArray mImage64ByteArray;
QBuffer buffer(&mImage64ByteArray);
buffer.open(QIODevice::WriteOnly);
jpgImage.save(&buffer, "JPG");
mImage64ByteArray = mImage64ByteArray.toBase64();

2 个答案:

答案 0 :(得分:1)

您没有为QByteArray调用正确的构造函数。当您将imgBuffer指针传递给QByteArray构造函数时,您可能并不意味着取消引用它。在您的情况下最终发生的是您最终调用QByteArray(int size, char ch)构造函数而不是QByteArray(const char* data, int size)构造函数。

除此之外,imgBufferSize肯定会出错,因为你在指针类型上使用sizeof,这只会返回指针的大小,而不是指针的大小分配的内存。 imgBufferSize应该是m_ImageWidth*m_ImageHeight。这解释了为什么你的base64编码字符串充满了0x07的值,因为这是你平台上指针的大小减去1。

所以正确的代码看起来像这样:

int imgBufferSize = m_ImageWidth*m_ImageHeight;
QByteArray temp = QByteArray(imgBuffer, imgBufferSize);
QByteArray base64Image = temp.toBase64();

除此之外,你应该听你的编译器,因为一个合理的编译器会给你一个关于从int到char的缩小转换的警告。同样,如果您使用调试器逐步执行代码,其中一些问题应该相当明显。考虑去除字节数组的手动分配也是值得考虑的,并且一直使用QByteArray。这将消除一些复制,使您不必手动管理内存,并简化您的程序。

答案 1 :(得分:1)

@Jacob是对的。只是为了告诉你什么是错的,这是更正后的版本:

int imgBufferSize = sizeof(imgBuffer);// - 1 propably wrong
QByteArray temp = QByteArray(imgBuffer, imgBufferSize); //use the pointer!
QByteArray base64Image = temp.toBase64();

如您所见,您需要传递指针。此外,由于您正在使用字节数组而不是c字符串,因此-1是错误的!但当然这取决于GetImage方法