3

IJG の libjpeg ライブラリのバージョン 8d を使用して、24 ビット Windows ビットマップ (.bmp) ファイルから JPEG 画像を作成しています。

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 エンコーディングが適切に行われるようにするために必要な追加の手順はありますか?

4

1 に答える 1

3

BMP ファイルは BGR 順のピクセル カラーでエンコードされ、JPEG ライブラリは RGB 順を想定しています。3 つの各グループから赤と青のバイトを逆にする必要があります。

BMP ファイルも、ファイルの一番上が一番下の行で構成されているため、これも逆にする必要があります。

于 2012-11-14T17:39:30.047 に答える