画像の印刷に使用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
、バッファの終わりを超えて読み取ろうとするため、クラッシュが発生するため、問題が何であるかについて漠然とした考えがあります。それでも、一部のサイズでは機能するが他のサイズでは機能しないため、なぜそれを行っているのかを正確に診断する方法がわかりません。