几天后,我不得不放弃并提交这个问题。我要做的基本上是非常简单的 - 这是代码:
switch ( state )
{
case INIT:
if (jpeg_read_header(&p_jpeg.info, true) == JPEG_SUSPENDED)
{
return SUSPEND;
}
if ( p_jpeg.info.jpeg_color_space == JCS_CMYK
|| p_jpeg.info.jpeg_color_space == JCS_YCCK ) return UNSUPPORTED;
p_jpeg.info.out_color_space = JCS_RGB;
p_jpeg.info.dct_method = JDCT_FLOAT;
p_jpeg.info.dither_mode = JDITHER_FS;
p_jpeg.info.do_fancy_upsampling = TRUE;
p_jpeg.info.enable_2pass_quant = FALSE;
p_jpeg.info.do_block_smoothing = TRUE;
jpeg_calc_output_dimensions(&p_jpeg.info);
int row_size = p_jpeg.info.output_width * p_jpeg.info.output_components;
p_jpeg.samples = (*p_jpeg.info.mem->alloc_sarray)((j_common_ptr) &p_jpeg.info,
JPOOL_IMAGE,
row_size, 1);
state = START;
case START:
if (!jpeg_start_decompress(&p_jpeg.info))
{
return SUSPEND;
}
state = WORK;
case WORK:
JSAMPARRAY samples = p_jpeg.samples;
while (info->output_scanline < info->output_height) {
if (jpeg_read_scanlines(info, samples, 1) != 1 ) //one scanline only
{
return SUSPEND; // we need more data
}
//copy line to destination
char* line = (char*)samples[0];
for (unsigned i = 0; i < info->output_width; ++i)
{
(*row).r = *line++;
(*row).g = *line++;
(*row).b = *line++;
}
} //end while
state = DONE;
case DONE:
while (!jpeg_finish_decompress(&p_jpeg.info))
{
return SUSPEND;
}
return SUCCESS;
} //switch
有了我从各种相机和其他来源获得的所有文件,一切都像魅力一样 - 图像被加载到 RGB 缓冲区中,瞧!然而,真正困扰我的是我遇到某些加载严重失真的 JPG 图像 - 更糟糕的是 - 我正在使用的 libjpeg 的 8d 分发中包含的示例 JPGS 也被扭曲了 - 这意味着我可能做错了什么。有人可以指出我正确的方向吗?上面的代码有什么问题,有时可以,但在 - 让我再次强调,在极少数情况下,它会给我带来严重扭曲的图像(查看使用上述代码加载的参考图像的附加示例)。
感谢您的帮助!
来自 libjpg 8d 发行版的原始图像文件:
在这种情况下,我使用上面的代码得到图像失真
PS:上面的代码是从真实代码中必不可少的提取物——我想这无论如何都无关紧要。