C# 如何检查由Uri创建的BitmapImage是否实际上是图像?
我的应用程序从Internet接收拖放的链接,并尝试从提供的链接创建图像 代码看起来像这样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
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);
}