2012-11-14 81 views
3

我们使用IJG libjpeg库的8d版本来从24位Windows位图(.bmp)文件创建JPEG图像。使用libjpeg/C++从文件中JPEG编码位图(BMP)图像

write_JPEG_file()正在使用没有任何修改从IJG的example.c功能,如出现此: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编码正确完成?

回答

3

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

BMP文件也按照文件顶部的底线组织,您也可以将其反转。

+0

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