我正在编写一个基于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()
,但我不知道为什么图像显示不同。有人可以帮我搞定吗?
答案 0 :(得分:3)
关于BITMAPINFO的文档说明了有关DIB的内容:
[...]每条扫描线必须用零填充,以便在LONG数据类型的边界上结束。
这意味着row_stride
必须是4个字节的倍数。这是计算这个的一种方法:
int row_stride = (cinfo.output_width * 3 + 3) / 4 * 4;
同样,DDB行的大小必须是2的倍数。
答案 1 :(得分:2)
对于Windows位图,需要将扫描线填充到DWORD边界。您的测试图像可能有一个奇怪的宽度。
答案 2 :(得分:0)
你不需要libjpeg! Jpeg在Windows(Shell)中是原生的,与所有图形格式一样