我有一个包含.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#本身做一些特定的事情,因为我需要在那里工作。
答案 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 - 但这是位图,而不是压缩的任何东西。