- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写代码来捕获此 OutOfMemoryException
并抛出一个新的、更直观的异常:
/// ...
/// <exception cref="FormatException">The file does not have a valid image format.</exception>
public static Image OpenImage( string filename )
{
try
{
return Image.FromFile( filename );
}
catch( OutOfMemoryException ex )
{
throw new FormatException( "The file does not have a valid image format.", ex );
}
}
此代码是否为用户所接受,或者 OutOfMemoryException
是否出于特定原因有意抛出?
最佳答案
不,这是历史。 GDI+ 是在 .NET 出现之前编写的。它的 SDK 包装器是用 C++ 编写的。异常在 C++ 中是不确定的,并不是每个人都接受它们。例如,谷歌没有。因此,为了保持兼容性,它会报告错误代码的问题。这永远无法很好地扩展,库程序员将有意限制可能的错误代码的数量作为目标,它减轻了客户端程序员必须报告它们的负担。
GDI+ 确实存在这个问题,它只定义了 20 个错误代码。对于具有如此多外部依赖项的如此大的代码块来说,这不算太多。这本身就是一个问题,有无数种方法可以弄乱图像文件。库的错误报告不可能足够细化以涵盖所有错误。这些错误代码早在 .NET 定义标准异常派生类型之前就已被挑选出来,这一事实当然无济于事。
Status::OutOfMemory 错误代码重载意味着不同的事情。有时它确实意味着内存不足,它无法分配足够的空间来存储位图位。遗憾的是,图像文件格式问题由相同的错误代码报告。这里的摩擦是它无法确定它从图像文件中读取的宽度 * 高度 * 像素是否有问题,因为没有足够的存储空间可用于位图。或者如果图像文件中的数据是垃圾。它假设图像文件不是垃圾,公平的调用,那是另一个程序的问题。所以 OOM 就是它报告的内容。
为了完整起见,这些是错误代码:
enum Status
{
Ok = 0,
GenericError = 1,
InvalidParameter = 2,
OutOfMemory = 3,
ObjectBusy = 4,
InsufficientBuffer = 5,
NotImplemented = 6,
Win32Error = 7,
WrongState = 8,
Aborted = 9,
FileNotFound = 10,
ValueOverflow = 11,
AccessDenied = 12,
UnknownImageFormat = 13,
FontFamilyNotFound = 14,
FontStyleNotFound = 15,
NotTrueTypeFont = 16,
UnsupportedGdiplusVersion = 17,
GdiplusNotInitialized = 18,
PropertyNotFound = 19,
PropertyNotSupported = 20,
#if (GDIPVER >= 0x0110)
ProfileNotFound = 21,
#endif //(GDIPVER >= 0x0110)
};
关于c# - Image.FromFile 为无效图像格式抛出 OutOfMemoryException 是否有原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23469219/
我不明白为什么有两段代码要做完全相同的事情,却在 Scala 中做不同的事情。 第一个例子: scala> val ggg = Source.fromFile("/somefile"); ggg: s
我想创建一个 Windows 窗体,它从文件中获取图像并显示在 C# 的 pictureBox 中当我在“=”之后键入 image.FromFile 时遇到问题,FromFile 变成红色下划线,就好
我使用 Image.FromFile() 读取用户上传的图像文件。对于“选择文件”对话框,我可以允许哪些文件扩展名? 谢谢! 最佳答案 来自微软的文档:http://msdn.microsoft.co
我想知道以下代码片段的效率是多少: val lst = Source.fromFile(f).getLines.toList 发出lst.contains(x)时, 这是否意味着f正在被重新扫描,或者
我可能想在这里重新发明轮子,但是 numpy 有一个 fromfile() 函数,可以读取 - 我想 - CSV 文件。 它的速度似乎令人难以置信 - 即使与 Pandas read_csv() 相比
我正在尝试更新一些在方法中使用 np.fromfile 的旧代码。当我尝试在 numpy 源中搜索此方法时,我只找到 np.core.records.fromfile ,但是当您搜索文档时,您可以找到
我正在尝试向 numpy.fromfile 传递一个模拟的 file,但我不断收到以下错误: IOError: !first argument must be an open file 这是一个基本示
np.fromfile() 是否有最大文件大小?我正在尝试读取一个 48GB 的文件,其中包含大约 2.1e9 条记录(每条记录有 5 个值)。 当我将计数限制为 8e7 时它起作用了: from
我正在尝试使用 numpy.fromfile阅读structured array (文件头)通过传入 user defined data-type .出于某种原因,我的结构化数组元素以二维数组而不是平
这个问题可能是微不足道的,但我真的不知道如何解决它。假设我使用 np.int64 类型生成一个大小为 (4,3) 的 numpy 数组,然后写入二进制文件。该数组如下所示: [[ 1 2 3]
我有一个带有 xfce 窗口管理器的系统 fedora 15。 我安装了一个 inotify 工具来玩。 我想控制我的文件在我的工作过程中会发生什么。我今天使用一个命令来运行 inotify inot
我有一些大文件(甚至压缩到 10GB 左右),其中包含一个 ASCII header ,然后原则上每个大约 3MB 的 numpy.recarrays,我们称它们为“事件”。我的第一种方法是这样的:
为什么我会遇到内存不足的错误?谢谢 if (File.Exists(photoURI)) { FileStream fs = new FileStream(photoURI, FileMode
我有一个二进制文件,其中包含飞机位置的记录。每条记录如下所示: 0x00: Time, float32 0x04: X, float32 // X axis position 0x08: Y, flo
我写的文件传输代码如下: val fileContent: Enumerator[Array[Byte]] = Enumerator.fromFile(file) val size = file.le
全部, 我有一个只有 ~120MB 的 CSV 文件(将其命名为 demo.csv) 以下代码会导致堆从正常大小的 100MB 膨胀到 1.7GB,尽管加载的底层数据只有 120MB 我可以在哪些方面
我在这种情况下使用 Image.FromFile(string) 方法: using System; using System.Collections.Generic; using System.Co
它和我想象的一样奇怪。 o.0. 我已经检查并仔细检查了,甚至不明白为什么它不起作用... 下面是使用的代码: try { if (!(Directory.Exists(@"C:\Simple
我发现了几个类似的问题,但没有一个能准确描述我面临的问题。我有一个 OBJ 文件,其中包含描述顶点位置的行: v 0.01214 0.4242 0.82874 我想将此数据转换为 matlab 友好的
我正在使用 numpy.fromfile 构建一个数组,我可以将其传递给 pandas.DataFrame 构造函数 import numpy as np import pandas as pd de
我是一名优秀的程序员,十分优秀!