2017-04-09 235 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方法