2016-08-12 17 views
0

RGBQUADポインタをMagic::Imageに変換する必要があります。私は以下のコードで試しました。しかし、それは、どのように私は魔術::画像にRGBQUADの配列を変換することができMagick::ErrorCorruptImageRGBQUADポインタからMagick ++イメージを作成する

Blob blob = Blob(pBuffer, width*height*sizeof(RGBQUAD)); 
Image img; 
img.size(Geometry(width, height)); 
img.magick("RGBA"); 
img.read(blob); 

でクラッシュ?

答えて

0

このエラーは、デフォルトでQuantumサイズの「RGBA」形式が原因で発生していると考えられます。通常16Q

8Qに設定すると、RGBQUADは​​データ型にする必要があります。

Blob blob = Blob(pBuffer, width*height*sizeof(RGBQUAD)); 
Image img; 
img.size(Geometry(width, height)); 
img.depth(8); 
img.magick("RGBA"); 
img.read(blob); 

... しかし ... RGBQUADの最後のバイトがアルファチャンネルに予約、およびされていません。引用ドキュメントから...

はこのメンバーが予約され、ゼロでなければならない

をrgbReserved。

これにより、ImageMagickに渡すすべてのblobが透明になります。

データを新しいバッファにコピーし、最後のバイトが完全に不透明であることを確認することをお勧めします。例えば

...コメントそれらを反復しやすいこと、およびアルファチャンネル値を代入するよりもpBufferは、RGBQUAD *として定義されている場合

から

// Note: I'm using data type `uint8_t' over `BYTE' for no particular reason. 
size_t rgbquad_size = sizeof(RGBQUAD); 
size_t total_bytes = width * height * rgbquad_size; 
uint8_t * pCopyBuffer = new uint8_t[total_bytes]; 
for (size_t cursor = 0; cursor < total_bytes; ++cursor) { 
    if (cursor % rgbquad_size < rgbquad_size - 1) { 
     pCopyBuffer[cursor] = pBuffer[cursor]; 
    } else { 
     pCopyBuffer[cursor] = 0xFF; 
    } 
} 
Blob blob = Blob(pCopyBuffer, total_bytes); 

編集。

for (size_t cursor = 0; cursor < width*height; ++cursor) 
    pBuffer[cursor].rgbReserved = 0xFF; // Set Alpha 
+0

Visual Studioでは、RGBQUADをuint8_tに変換できないと言われています。どのようにそれを修正する上で任意のアイデア? – gallileo

+0

'pBuffer'はどのように定義されていますか? – emcconville

+0

'RGBQUAD * pBuffer'として。 – gallileo

関連する問題