我有一个包含 .png 图片的图像变量。
为了计算它在磁盘上的大小,我目前将它分配到内存缓存中,然后使用该“内存文件”的长度来计算它是否在我想要的文件大小范围内。
因为这对我来说似乎效率很低(“真正的”计算可能更快并且内存占用更少)我想知道是否有其他方法可以做到这一点。
示例:
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 的一部分,因此 Web 特定的东西在那里不起作用,因为我需要用 C# 本身做一些事情。
最佳答案
您可以通过实现自己的 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
被硬编码为返回零)。
关于c# - 有没有比将图像保存到流来计算它在磁盘上有多大的不同方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27226336/