2

データベースから jpeg 画像を表示する Win32 ベースのアプリケーションを作成しています。デコーダーとして libjpeg を選択しましたが、ほとんどの画像が正しく表示されません。画像の幅を 1 つずつ増減することで修正できますが、以前は正しく表示されていた画像が、この修正後に正しく表示されなくなります。これが私のコードの一部です(RGBからBGRへの変換を除く):

int JpegToRaw(BYTE *input, int insize, BYTE *output, int &width, int &height)
{
    struct jpeg_decompress_struct cinfo;
    struct jpeg_error_mgr jerr;

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_decompress(&cinfo);

    jpeg_mem_src(&cinfo, input, insize);
    jpeg_read_header(&cinfo, TRUE);

    jpeg_start_decompress(&cinfo);

    //--cinfo.output_width; or ++cinfo.output_width;

    int row_stride = cinfo.output_width * 3;
    int outsize = row_stride * cinfo.output_height;
    output = (BYTE *)malloc(outsize * sizeof(BYTE));
    BYTE *pos = output;

    while (cinfo.output_scanline < cinfo.output_height)
    {
        jpeg_read_scanlines(&cinfo, &pos, 1);
        pos += row_stride;
    }

    width = cinfo.output_width;
    height = cinfo.output_height;

    jpeg_finish_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);
    return outsize;
}

HBITMAP RawToBitmap(BYTE *input, int size, int width, int height)
{
    BITMAPINFO bi;
    bi.bmiHeader.biSize        = sizeof(bi24BitInfo.bmiHeader);
    bi.bmiHeader.biWidth       = width;
    bi.bmiHeader.biHeight      = -height;
    bi.bmiHeader.biPlanes      = 1;
    bi.bmiHeader.biBitCount    = 24;
    bi.bmiHeader.biCompression = BI_RGB;

    HBITMAP hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, NULL, NULL, 0);
    SetBitmapBits(hBitmap, size, input);
    return hBitmap;
}

有効な jpeg 配列を に渡していると確信してJpegToRaw()いますが、画像の表示が異なる理由がわかりません。誰かがそれを手に入れるのを手伝ってくれますか?

4

3 に答える 3

3

BITMAPINFOに関するドキュメントには、DIB について次のように記載されています。

[…] 各走査線は、LONG データ型の境界で終了するようにゼロでパディングする必要があります。

これはrow_stride、4 バイトの倍数でなければならないことを意味します。これを計算する 1 つの方法を次に示します。

int row_stride = (cinfo.output_width * 3 + 3) / 4 * 4;

同様に、DDB 行のサイズは 2 の倍数でなければなりません。

于 2011-03-18T22:58:37.663 に答える
2

Windows ビットマップの場合、スキャンラインを DWORD 境界までパディングする必要があります。テスト画像の幅が奇妙である可能性があります。

于 2011-03-18T22:59:26.343 に答える
0

libjpegは必要ありません!Jpegは、すべてのグラフィック形式と同様に、Windows(シェル)でネイティブです

于 2011-03-21T20:39:24.647 に答える