validateImageData参数和Image.FromStream()

我关心这个重载中的第三个参数validateImageData。 文档没有解释太多,只是说它导致图像数据被validation但没有细节,究竟是做了什么来validation图像数据?

public static Image FromStream ( Stream stream, bool useEmbeddedColorManagement, bool validateImageData ) 

我想在Web应用程序中使用它,所以,我想知道如果我将validateImageData设置为true将会发生什么,我想确保用户上传的是有效图像,是否建议将validateImageData设置为true或者是否足以在抛出exception时捕获exception? 另外,将validateImageData设置为true可以以任何方式影响性能吗? (用户可以上传最大250k的图片)

谢谢

从Reflector,我们看到:

 if (validateImageData) { num = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, zero)); if (num != 0) { SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, zero)); throw SafeNativeMethods.Gdip.StatusException(num); } } 

所以我们看到调用了GdipImageForceValidation (回想一下,System.Drawing只是GDI +的一个包装器)。 这个函数的文档不是很好:

此function强制validation图像。

不是很有用。 但是,重点是 – 询问图像文件以确保加载是安全的。 这可能导致整个图像被加载到内存中。

如果您接受来自用户的输入,我当然会将此标志设置为true – 您永远不会知道用户将上载哪种文件(格式错误或其他)。 比抱歉更安全。 这就是默认值为true

另请注意,建议不要将GDI +用于服务器环境。 你最好使用System.Windows.Media.Imaging

通过仔细阅读内部reflection器,您将看到默认情况下.NET始终在名为GdipImageForceValidation的GDI +库中调用本机API(通过为validateImageData参数传递true)。 我找不到MSDN中的本机API ,只有这个 ,它告诉我们的不过是函数本身的名称。 但是,看来这种方法会导致性能下降,这是基于Justin Roger关于通过.NET以最快的方式加载图像的post 。 期望任何“validation”步骤都会影响性能也是直观的。

但是,如果为validateImageData参数指定false,则.NET将显式触发非托管代码安全性 需求 ,这意味着框架作者决定强制进行图像validation是必要的,以便使托管代码的承诺安全,并最终能够相信调用者所说的数据代表一个图像。 因此,虽然为validateImageData指定flase可能会提高性能,但在不完全信任的安全上下文中,它可能会生成exception,您最好相信您认为是图像的数据。

我记得用这个参数读了一些问题。 看到这篇文章(它很老了,但要小心)。

为什么不试着看看那个标志集发生了什么而没有设置?

在任何一种情况下,您都应该处理可能引发的任何exception。