Я запутался в том, как 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 строку одновременно со строкой
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];
Начало буфера используется повторно для каждой строки сканирования. Большая часть вашего текущего буфера фактически не используется.
Для данных 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.