1

画像の印刷に使用StretchDIBitsしていますが、画像が特定のサイズになると何らかの理由で失敗します。

画像データは、24 ビット BGR 形式の他の画像ソースから unsigned int 配列にロードされます。先ほど言ったように、一部のサイズでは機能しますが、まったく機能しないため、画像とバッファーが完全に問題ないことを既に確認しました。

私がテストしている現在のサイズは 638x1014 です。高さを 1013 に変更すると正常に動作しますが、1014 の場合は何らかの理由で完全に失敗します。

すべてがどのようにセットアップされているかを示すコードを次に示します。

unsigned int * buffer = new unsigned int[width * height * 3];

// Fill buffer with image data...

BITMAPINFOHEADER bi = { 0 };
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = width * height * 3; // Specifying this value because if I don't it will crash trying to read outside of the buffer.

StartPage(hdcPrint);
SetMapMode(hdcPrint, MM_ISOTROPIC);
SetWindowExtEx(hdcPrint, width, height, NULL);
SetViewportExtEx(hdcPrint, width, height, NULL);
SetViewportOrgEx(hdcPrint, 0, 0, NULL);

StretchDIBits(hdcPrint, 0, 0, width, width, 0, 0, width, height, buffer, (BITMAPINFO *) &bi, DIB_RGB_COLORS, SRCCOPY);

StretchDIBits失敗し、印刷結果が空白ページの場合はゼロを返します。

biSizeImageコメントにあるように、指定せずにゼロのままにしておくとStretchDIBits、バッファの終わりを超えて読み取ろうとするため、クラッシュが発生するため、問題が何であるかについて漠然とした考えがあります。それでも、一部のサイズでは機能するが他のサイズでは機能しないため、なぜそれを行っているのかを正確に診断する方法がわかりません。

4

1 に答える 1

5

幅のバイト数が間違っています。Windows では、各行が 4 バイトの倍数である必要があります。638*3は 1914 で、2 バイト恥ずかしがり屋です。

于 2012-12-05T01:42:18.273 に答える