使用 libjpeg / C++ 从文件中提取 JPEG 编码位图 (BMP) 图像

Posted

技术标签:

【中文标题】使用 libjpeg / C++ 从文件中提取 JPEG 编码位图 (BMP) 图像【英文标题】:JPEG encoding bitmap (BMP) image from file using libjpeg / C++ 【发布时间】:2012-11-14 17:34:01 【问题描述】:

我们使用 IJG 的 libjpeg 库的 8d 版从 24 位 Windows 位图 (.bmp) 文件创建 JPEG 图像。

IJG 的 example.c 中的 write_JPEG_file() 函数无需任何修改即可使用,如下所示:http://code.google.com/p/sumatrapdf/source/browse/trunk/ext/libjpeg-turbo/example.c?r=2397

执行的步骤顺序如下:

BITMAPFILEHEADER bfh;
BITMAPINFO bi; 
BITMAPINFOHEADER *bih;
FILE *input;
int image_height;
int image_width;

fopen_s( &input, "image.bmp", "rb" ); // Open existing file

// Read bitmap file header
fread_s( &bfh, sizeof(BITMAPFILEHEADER), 1, sizeof(BITMAPFILEHEADER), input );

// Read bitmap info header
fread_s( &bi, sizeof(BITMAPINFO), 1, sizeof(BITMAPINFO), input );

bih = &bi.bmiHeader;
image_height = bih->biHeight;
image_width = bih->biWidth;
int data_size = image_width * image_height * 3; // Compute image data size

// Allocate image buffer; this is the buffer write_JPEG_file() will use
JSAMPLE * image_buffer = (JSAMPLE *)malloc( data_size );

// Read image pixel data from file
fread_s( image_buffer, data_size, 1, data_size, input );

fclose( input );

write_JPEG_file( "image.jpg", 100 /* quality */ );

尽管一切正常,但生成的 JPEG 图像与原始位图图像的颜色不同,例如,红色和蓝色交换,黄色和青色相同......

我们尝试使用 fseek() 将输入文件光标设置为 bfh.bfOffBits,但颜色仍然关闭。

是否需要任何额外的步骤来确保正确完成 JPEG 编码?

【问题讨论】:

【参考方案1】:

BMP 文件以 BGR 顺序使用像素颜色进行编码,而 JPEG 库需要 RGB 顺序。您必须将每组 3 个中的红色和蓝色字节反转。

BMP 文件也以文件顶部的底线进行组织,您也需要反转它。

【讨论】:

谢谢你,马克。以下是 BGR 到 RGB 转换的示例:tipsandtricks.runicsoft.com/Cpp/BitmapTutorial.html

以上是关于使用 libjpeg / C++ 从文件中提取 JPEG 编码位图 (BMP) 图像的主要内容,如果未能解决你的问题,请参考以下文章

从libjpeg中的yuv中提取灰度

在 C++ 中使用 libsndfile 从 WAV 文件中提取原始音频数据

应用libjpeg提取jpeg质量因子

从 C++ 文件中提取 JSON 数据

dyld:库未加载:/usr/local/opt/jpeg/lib/libjpeg.9.dylib OpenCV C++ MacOS

编译生成64位Libjpeg库