是否有不同的方法将图像保存到流中以计算它在磁盘上的大小?

时间:2014-12-01 10:27:49

标签: c# image-processing

我有一个包含.png图片的图片变量。

为了计算它在磁盘上的大小,我现在把它放到内存缓存然后使用该内存文件的长度"计算它是否在我想要的文件大小范围内。

因为这对我来说似乎效率很低(#34;真实"计算可能更快,内存更少)我想知道是否有办法以不同的方式做到这一点。

实施例

private bool IsImageTooLarge(Image img, long maxSize)
{
    using (MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        if (ms.ToArray().Length > maxSize)
        {
             return true;
        }
    }
    return false;
}

其他信息: 源代码是.dll的一部分,因此我需要在C#本身做一些特定的事情,因为我需要在那里工作。

2 个答案:

答案 0 :(得分:2)

您可以通过实施自己的Stream来节省内存,比如PositionNullStream,这类似于Stream.Null对象后面的NullStream类,但是位置可以计数器。您的实现将为图像的Save方法提供只写流,并在Save完成后从中收集当前位置。

private bool IsImageTooLarge(Image img, long maxSize)
{
    using (var ps = new PositionNullStream()) {
        img.Save(ps, System.Drawing.Imaging.ImageFormat.Png);
        return ps.Position > maxSize;
    }
}

您可以在1445..1454 here行找到NullStream的示例实现。在编写和重新定位方法时,更改实现以存储当前位置(NullStream被硬编码为返回零)。

答案 1 :(得分:0)

不,没有办法。因为您不需要图片的大小而是文件的大小。获得它的唯一方法 - 包括任何涉及压缩的东西 - 就是压缩它并看看它是什么。

如果没有它,你可以说X * Y * Bytes Per Pixel - 但这是位图,而不是压缩的任何东西。