如何在使用特定品质因数保存之前估计Jpeg文件的大小?

时间:2009-11-16 06:37:32

标签: jpeg

我有一个24位的位图,我正在用c ++编写应用程序,MFC, 我使用libjpeg将位图编码为jpeg文件24bits。

当此位图的宽度为M,高度为N时。

如何在使用特定品质因数N(0-100)保存之前估算jpeg文件大小。

是否可以这样做?

例如。 我想实现一个滑动条,它表示保存具有特定品质因数N的当前位图。 旁边有一个标签。显示使用此品质因数解码位图时的近似文件大小。 当用户移动滑动条时。他可以近似预览tobe保存的jpeg文件的文件大小。

3 个答案:

答案 0 :(得分:3)

在libjpeg中,您可以编写一个实际上不调用fwrite的自定义目标管理器,但只计算写入的字节数。

从jdatadst.c中的stdio目标管理器开始,查看libjpeg.doc中的文档。

您的init_destinationterm_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;