libjpeg: как получить правильный размер распакованного изображения?

У меня такой обычный код:

struct jpeg_decompress_struct cinfo;
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
jpeg_read_header(&cinfo, TRUE);

cinfo.scale_num = ?;
cinfo.scale_denom = ?;

needed_width = cinfo.output_width;
needed_height = cinfo.output_height;

Как забрать scale_num а также scale_denum параметры для масштабирования изображения до нужного размера. Я хочу, например, масштабировать его вдвое меньше.

Если я установлю scale_num = 1 , scale_denom = 2 , Результат: (1802 x 1237) до (258 x 194)

В документации сказано:

Scale the image by the fraction scale_num/scale_denom.  Default is
1/1, or no scaling.  Currently, the only supported scaling ratios
are 1/1, 1/2, 1/4, and 1/8.

Но когда я устанавливаю такие пропорции, я не получаю необходимых результатов.

Итак вопрос является: Как установить scale_num а также scale_denom чтобы получить изображение с максимальным размером, аналогичным необходимому.

2

Решение

Вы должны вызвать jpeg_calc_output_dimensions (cinfo), чтобы получить правильные значения output_width и output_height.

Для вычисления коэффициента scale_denom я обычно делаю что-то вроде этого:

unsigned int intlog2(unsigned int val) {
int targetlevel = 0;
while (val >>= 1) ++targetlevel;
return targetlevel;
}

// ....
// for example,
const int width = 5184;
const int height = 3456;

unsigned int needed_width = 640;
unsigned int needed_height = 480;

unsigned int wdeg = intlog2(width / needed_width);
unsigned int hdeg = intlog2(height / needed_height);

unsigned int scale_den = std::min(1 << (std::min)(wdeg, hdeg), 8);

unsigned int result_width = width / scale_den;
unsigned int result_height = height / scale_den;
4

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

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

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