libjpeg / CreateDIBSection проблема - PullRequest
2 голосов
/ 19 марта 2011

Я пишу приложение для Win32, которое отображает изображения в формате JPEG из базы данных.Я выбрал libjpeg в качестве декодера, но большинство изображений отображаются неправильно.Это можно исправить, увеличив или уменьшив ширину изображения на единицу, однако изображения, которые были правильно отображены до неправильного отображения после этого исправления.Вот часть моего кода (исключая преобразование из 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(), но не знаю, почему изображения отображаются по-разному.Может ли кто-нибудь помочь мне получить это?

Ответы [ 3 ]

3 голосов
/ 19 марта 2011

Документация о BITMAPINFO гласит это о DIB:

[…] каждая строка сканирования должна быть дополнена нулями до конца на длинной границе типа данных.

Это означает, что row_stride должно быть кратно 4 байтам.Вот один из способов вычислить это:

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

Аналогично, размер строки DDB должен быть кратным 2.

2 голосов
/ 19 марта 2011

Для растровых изображений Windows линии сканирования должны быть дополнены до границ DWORD.Ваши тестовые изображения могут иметь нечетную ширину.

0 голосов
/ 21 марта 2011

Вам не нужен libjpeg!Jpeg является родным в Windows (Shell), как и все графические форматы

...