c# - 有没有比将图像保存到流来计算它在磁盘上有多大的不同方法?

标签 c# image-processing

我有一个包含 .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/

相关文章:

c# - Database.ExecuteSqlCommand 的返回值是什么?

c# - 在 C# 应用程序中运行 CPP 文件?

matlab - Matlab/OpenCV创建角度图像

python - 在python中插入有界像素

OpenCV:基本矩阵和移动相机

image - 如何计算 Gabor 滤波器中的空间频率?

c# - 将 N 进制 B 样条曲线转换为二次或三次 B 样条曲线序列

c# - 如何识别 Outlook 加载项中的 "my"自定义文件夹

c# - 在 PropertyGrid 中动态设置属性的只读属性

c# - 为图像中的对象绘制边界框