C# 如何检查由Uri创建的BitmapImage是否实际上是图像?

C# 如何检查由Uri创建的BitmapImage是否实际上是图像?,c#,wpf,uri,bitmapimage,C#,Wpf,Uri,Bitmapimage,我的应用程序从Internet接收拖放的链接,并尝试从提供的链接创建图像 代码看起来像这样 if (link.StartsWith("http")) { try { itemImage.Source = new BitmapImage(new Uri(link)); if (itemImage.Source != null) { if (itemImage.Visibility == Visibility.C

我的应用程序从Internet接收拖放的链接,并尝试从提供的链接创建图像

代码看起来像这样

if (link.StartsWith("http"))
{
    try
    {
        itemImage.Source = new BitmapImage(new Uri(link));
        if (itemImage.Source != null)
        {
            if (itemImage.Visibility == Visibility.Collapsed)
                ShowImage();
        }
    }
    catch (Exception){}
}
当提供的链接包含到图像的路径时,它可以很好地处理它的工作。 例如,如果路径为“”,则程序假定此链接也提供图像,因此它在If条件(imageSource!=null)内运行代码,并显示空图像

然而,当按下按钮保存无效的“图像”并检查源是否真的为空时,程序运行ShowNameError方法(假设名称设置正确)

换句话说,ImageSource在第一种情况下不是空的,但在第二种情况下它是空的,这是没有意义的,因为代码ImageSource中没有任何地方被操作了


既然这些魔术正在发生,我想问你如何检查由Uri创建的BitmapImage是否真的是一个图像?

你可以使用魔术字节来“查看”图像是否真的是一个已知的图像格式。您可以在上看到完整的列表


例如,PNG总是以
89 50 4E 47 0D 0A 1A 0A
开头。您可以下载二进制数据并对照PNG、JPG、BMP等的魔法字节检查二进制结果。如果匹配,您可能会安全。

您应该检查BitmapImage是否已立即加载位图。如果
IsDownloading
属性为true,则为
DownloadCompleted
DownloadFailed
事件附加一个处理程序:

var image = new BitmapImage(new Uri(link));

if (image.IsDownloading)
{
    image.DownloadCompleted += (s, e) => ShowImage(image);
}
else
{
    ShowImage(image);
}

不清楚你在问什么。如果
itemImage.Source
一旦为非空,以后就不会神奇地变为空。无论如何,您应该知道,默认情况下,远程URL中的图像是延迟加载的。有些事件如
BitmapImage.DownloadCompleted
BitmapImage.DownloadFailed
,您可以将处理程序附加到这些事件。检查
是否(itemImage.Source!=null)
是多余的,因为可能是新创建的BitmapImage分配给了源,或者BitmapImage构造函数引发了异常。当达到if条件时,该条件始终为true。当解码失败时,处理DownloadCompleted event workedOP应获得异常。这可能会立即发生,例如,当加载本地图像文件时,或者稍后,当从远程URL图像加载的图像首次显示时。我认为您在评论中明确了问题:下载可能延迟,这会导致(失败的)图像为空。首先下载并检查解决了这个问题,正如建议的那样。我同意,现在它可以正常工作了,谢谢你的回答。
var image = new BitmapImage(new Uri(link));

if (image.IsDownloading)
{
    image.DownloadCompleted += (s, e) => ShowImage(image);
}
else
{
    ShowImage(image);
}