我们使用 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 编码?