我有一个24位的位图,我正在用c ++编写应用程序,MFC, 我使用libjpeg将位图编码为jpeg文件24bits。
当此位图的宽度为M,高度为N时。
如何在使用特定品质因数N(0-100)保存之前估算jpeg文件大小。
是否可以这样做?
例如。 我想实现一个滑动条,它表示保存具有特定品质因数N的当前位图。 旁边有一个标签。显示使用此品质因数解码位图时的近似文件大小。 当用户移动滑动条时。他可以近似预览tobe保存的jpeg文件的文件大小。
答案 0 :(得分:3)
在libjpeg中,您可以编写一个实际上不调用fwrite
的自定义目标管理器,但只计算写入的字节数。
从jdatadst.c中的stdio目标管理器开始,查看libjpeg.doc中的文档。
您的init_destination
和term_destination
方法将非常小(仅限alloc / dealloc),并且您的empty_output_buffer
方法将执行实际计数。完成JPEG编写后,您必须从自定义结构中读取计数值。确保在调用term_destination
之前执行此操作。
答案 1 :(得分:1)
它还取决于您使用的压缩,更具体地说,您使用的每个颜色像素的位数。
质量因素不会对您有所帮助,因为100的品质因数可以(在大多数情况下)从每个彩色像素6位到每个彩色像素~10位,甚至更多(不确定)。
所以一旦你知道那里真的很直接......
答案 2 :(得分:0)
如果您知道子采样因子,则可以估算。该信息来自帧标记的开始。
在宽度和高度之前的相同标记中,位深度也是如此。
如果你让
int subSampleFactorH = 2, subSampleFactorV = 1;
然后
int totalImageBytes = (Image.Width / subSampleFactorH) * (Image.Height / subSampleFactorV);
然后,您还可以选择添加更多字节来计算容器数据。
int totalBytes = totalImageBytes + someConstantOverhead;