2017-04-09 248 views
0

我已经在imgBuffer中捕获了指纹图像。如何将图像(BYTE *)转换为Base64

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(); 

回答

1

你是不是要求QByteArray正确的构造函数。当您将它传递给QByteArray构造函数时,您可能不会解除引用imgBuffer指针。你的情况最终发生的是你最终调用QByteArray(int size, char ch)构造函数而不是QByteArray(const char* data, int size)构造函数。

除此之外,该imgBufferSize肯定会是错误的,因为你在一个指针类型,这将只返回指针的大小,而不是分配的内存的大小,使用sizeofimgBufferSize应该可能是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。这将消除一些复制,避免您不得不手动管理内存,并简化程序。

+0

错误:没有构造函数“QByteArray :: QByteArray”的实例匹配参数列表。参数类型为:(BYTE *,int) – mmhyamin

+0

查看BYTE的类型。我会猜测BYTE是一个unsigned char的typedef,而QByteArray期望一个有符号的char。 – Jacob

+0

是** typedef无符号字符BYTE; ** – mmhyamin

1

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

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

正如你所看到的,你需要传递指针。另外,由于你正在处理一个字节数组,而不是一个c字符串,所以-1可能是错的!但当然这取决于GetImage方法