2017-04-09 4 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(const char* data, int size)コンストラクタの代わりにQByteArray(int size, char ch)コンストラクタを呼び出すことになります。

imgBufferSizeは、sizeofをポインタ型で使用しているため間違っていることは間違いありません。これはポインタのサイズを返し、割り当てられたメモリのサイズは返しません。 imgBufferSizeはおそらくm_ImageWidth*m_ImageHeightです。それはとても正しいコードは次のようになり、ご使用のプラットフォーム上のポインタのサイズだから1を引いた

ので、あなたのbase64でエンコードされた文字列は、0x07にうまく値の完全である理由を説明:

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はsigned charを期待しています。 – Jacob

+0

はい** typedef unsigned char 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メソッドに依存します

関連する問題