Запутался насчет libjpeg: jpeg_read_scanlines

Я запутался в том, как libjpeg jpeg_read_scanlines работает. Насколько я понимаю, он распаковывает JPEG, строка за строкой, и создает распакованный буфер пикселей.

Типичное использование что-то вроде:

jpeg_decompress_struct cinfo;

...

unsigned char* image = new unsigned char[cinfo.image_width  * cinfo.image_height];
unsigned char* ptr = image;
int row_stride = cinfo.image_width;

while (cinfo.output_scanline < cinfo.image_height)
{
jpeg_read_scanlines(&cinfo, &ptr, 1);
ptr += row_stride;
}

Вопрос: Я запутался в размер выходного буфера. В целом пример кода Я вижу, какие использует jpeg_read_scanlinesРазмер выходного буфера width X heightгде ширина и высота относятся к размерам файла JPEG. Таким образом, для файла JPEG 10×10 у нас будет 100-байтовый буфер вывода.

Но … не размер каждого пикселя RGB 3 байта (24-битный)? Поэтому не должно быть несжатых данных width X height X 3 байт?

Почему не так?

Я заметил, что с кодом, который использует jpeg_write_scanlinesбуфер для сжатия ЯВЛЯЕТСЯ width X height X 3, Так почему буфер используется с jpeg_read_scanlines только width X height?

1

Решение

Вы читаете только 1 строку одновременно со строкой

jpeg_read_scanlines(&cinfo, &ptr, 1);

так что вам нужна была только линия

unsigned char* image = new unsigned char[cinfo.image_width * cinfo.image_height];

быть

unsigned char* image = new unsigned char[cinfo.image_width * cinfo.image_components];

Начало буфера используется повторно для каждой строки сканирования. Большая часть вашего текущего буфера фактически не используется.

2

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

Для данных RGB, output_components будет 3 (R, G, B).

Вот некоторая связанная документация от libjpeg.txt:

   output_width     image width and height, as scaled
output_height
out_color_components # of color components in out_color_space
output_components    # of color components returned per pixel
colormap     the selected colormap, if any
actual_number_of_colors      number of entries in colormap

output_components is 1 (a colormap index) when quantizing colors; otherwise it
equals out_color_components.  It is the number of JSAMPLE values that will be
emitted per pixel in the output arrays.

Typically you will need to allocate data buffers to hold the incoming image.
You will need output_width * output_components JSAMPLEs per scanline in your
output buffer, and a total of output_height scanlines will be returned.
0

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