【问题标题】:How to tell if Image.FromStream is complete如何判断 Image.FromStream 是否完整
【发布时间】:2011-11-19 18:57:18
【问题描述】:

我有以下代码:

var request = (HttpWebRequest)HttpWebRequest.Create(url);
var response = request.GetResponse();
var stream = response.GetResponseStream();
if (stream != null) {
    Image newImage = Image.FromStream(stream, true);
    pic.Thumb = newImage.ImageToByteArray();
}

如果读取超时怎么办?或者连接在下载过程中中止?

文档说如果ArgumentException不是有效格式或为空,它会抛出一个异常,但我不知道如果图像只是部分下载,它是否会抛出该异常。

不幸的是,我不能依靠 ContentLength 标头来告诉我文件的正确大小,因为服务器位于并提供了比文件实际长度更大的内容长度。所以我希望 Image.FromStream 能够判断图像是否完整。

谁能在这里提供一些见解?

注意:ImageToByteArray 只是一种扩展方法,它使用内存流将Image 转换为byte[]

更新:

根据 Darin 的说法,当您尝试保存图像时会引发 ExternalException。但是,我自己截断图像文件的测试表明,如果图像的字节数不正确,FromStream 实际上会引发 ArgumentException。

【问题讨论】:

    标签: c# .net httpwebrequest gdi+ gdi


    【解决方案1】:

    如果读取超时怎么办?

    在进入if条件之前会抛出异常。

    或者连接被中止了?

    在进入if条件之前会抛出异常。

    但我不知道如果图像只是部分下载,它是否会抛出该异常。

    无法部分下载图像。 GetResponseStream 是一种阻塞方法,这意味着您要么获得所有内容,要么获得异常(当然,如果您获取的不是图像而是某些 HTML 页面,则在您的情况下,您也可能会遇到异常,当您尝试实例化 Image GDI+ 对象)。

    附带说明,为避免泄漏,您可能还希望将此 Image 一次性资源包装到 using 语句中。

    【讨论】:

    • 对,这是有道理的。如果服务器根本不发送完整的图像会发生什么? (假设他们在后端遇到负载问题并超时,只需发送部分图像,否则连接正常)
    • @Mystere 人,我不明白。您的意思是服务器发送一个无效图像的字节数组,例如托管损坏图像的远程资源?如果是,那么当您尝试将此流加载到 Image GDI+ 对象(Image.FromStream 方法)时,您将得到一个 ArgumentException
    • 我的意思是,我不确定 Image 类是否会将部分图像检测为无效并抛出 ArgumentException。
    • @Mystere Man, Image.FromStream 将抛出 ArgumentException 如果流包含它无法处理的无效图像,如文档中所述:msdn.microsoft.com/en-us/library/93z9ee4x.aspx
    • 是的,我阅读了文档。我在问 Image 类是否认为部分图像无效。我假设图像格式包含长度标头,但 Image 类是否验证实际数据的长度是否合适。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多