Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ libjpeg:如何获得合适的图像解压缩大小?_C++_Jpeg_Compression_Libjpeg - Fatal编程技术网

C++ libjpeg:如何获得合适的图像解压缩大小?

C++ libjpeg:如何获得合适的图像解压缩大小?,c++,jpeg,compression,libjpeg,C++,Jpeg,Compression,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_heig

我有这样一个常见的代码:

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\u num=1
scale\u denom=2
。结果是:(1802x1237)到(258x194)

文件说:

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\u num
scale\u denom
以获得与所需最大尺寸相似的图像。
您应该调用jpeg\u calc\u output\u dimensions(cinfo)以获得正确的输出宽度和输出高度值

为了计算系数刻度,我通常会这样做:

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;
unsigned int intlog2(unsigned int val){
int targetlevel=0;
而(val>>=1)++targetlevel;
返回目标级别;
}
// ....
//比如说,,
常数整数宽度=5184;
const int height=3456;
所需的无符号整数_宽度=640;
所需的无符号整数_高度=480;
无符号int wdeg=intlog2(宽度/所需宽度);
无符号int hdeg=intlog2(高度/所需高度);

unsigned int scale\u den=std::min(1您应该调用jpeg\u calc\u output\u dimensions(cinfo)以获得正确的输出宽度和输出高度值

为了计算系数刻度,我通常会这样做:

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;
unsigned int intlog2(unsigned int val){
int targetlevel=0;
而(val>>=1)++targetlevel;
返回目标级别;
}
// ....
//比如说,,
常数整数宽度=5184;
const int height=3456;
所需的无符号整数_宽度=640;
所需的无符号整数_高度=480;
无符号int wdeg=intlog2(宽度/所需宽度);
无符号int hdeg=intlog2(高度/所需高度);

unsigned int scale\u den=std::min(1您的输入宽度和高度以及所需的宽度和高度是多少,所需的高度是多少?3264 x 2448到1024 x 768,结果是1632 x 1224。但是libjpeg可以为此图像加载例如1224 x 918。您应该使用1632 x 1224(scale\u den=2)读取图像,然后执行调整大小到所需大小输入的宽度和高度是多少?所需的宽度和高度是多少?3264 x 2448到1024 x 768,结果是1632 x 1224。但是libjpeg可以为该图像加载例如1224 x 918。您应该使用1632 x 1224(比例=2)读取图像,然后执行调整大小到所需大小