Изображение растрового изображения (BMP) в кодировке JPEG из файла с использованием libjpeg / Stack Overflow

Мы используем версию 8d библиотеки IJG libjpeg для создания изображений JPEG из 24-битных файлов растровых изображений Windows (.bmp).

Функция write_JPEG_file () из файла example.c IJG используется без каких-либо изменений, как показано здесь: 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-файлы также организованы с нижней строкой в ​​верхней части файла, вы также хотите обратить это вспять.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]