このエラーは、デフォルトで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
Visual Studioでは、RGBQUADをuint8_tに変換できないと言われています。どのようにそれを修正する上で任意のアイデア? – gallileo
'pBuffer'はどのように定義されていますか? – emcconville
'RGBQUAD * pBuffer'として。 – gallileo