如何验证通过Uri创建的BitmapImage是否为有效图片?
解决非图片链接加载错误判断的问题
你的问题核心在于:BitmapImage即使加载非图片链接失败,实例本身依然存在,所以itemImage.Source != null会返回true,导致错误触发ShowImage();再加上空的catch块完全没处理加载失败后的逻辑,才会出现误判。
这里给你两个层面的改进方案,兼顾效率和准确性:
1. 先做快速的扩展名过滤(减少无效加载)
先通过链接的扩展名初步筛选出可能的图片链接,避免对明显的非图片链接(比如网页、文档)做加载尝试:
if (link.StartsWith("http")) { // 定义常见的图片扩展名,可根据需求补充 var validImageExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg" }; var linkUri = new Uri(link); var fileExtension = Path.GetExtension(linkUri.AbsolutePath).ToLowerInvariant(); // 先过滤非图片扩展名的链接 if (!validImageExtensions.Contains(fileExtension)) { itemImage.Source = null; if (itemImage.Visibility == Visibility.Visible) { // 调用你的隐藏图片方法 // HideImage(); } return; } // 后续处理图片链接的加载 try { var bitmap = new BitmapImage(); // 设置CreateOptions确保能正确捕获加载失败事件 bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache; // 加载成功时显示图片 bitmap.ImageOpened += (sender, args) => { itemImage.Source = bitmap; if (itemImage.Visibility == Visibility.Collapsed) { ShowImage(); } }; // 加载失败时重置并隐藏 bitmap.ImageFailed += (sender, args) => { itemImage.Source = null; if (itemImage.Visibility == Visibility.Visible) { // HideImage(); } args.Handled = true; }; bitmap.UriSource = linkUri; } catch (Exception ex) { // 这里可以记录错误日志,方便排查问题 itemImage.Source = null; // HideImage(); } }
2. 用加载事件精准判断状态
扩展名过滤不是100%可靠(比如某些动态生成的图片链接不带扩展名),这时候依赖ImageOpened和ImageFailed事件是最准确的方式:
ImageOpened:只有当图片成功加载完成后才触发,这时候再显示图片ImageFailed:加载失败时触发,直接重置Source并隐藏图片区域
另外,你也可以在加载完成后检查图片的像素尺寸,如果PixelWidth和PixelHeight都为0,说明加载的内容不是有效图片,同样做隐藏处理:
// 在ImageOpened事件里补充检查 bitmap.ImageOpened += (sender, args) => { var loadedBitmap = sender as BitmapImage; if (loadedBitmap != null && loadedBitmap.PixelWidth > 0 && loadedBitmap.PixelHeight > 0) { itemImage.Source = loadedBitmap; if (itemImage.Visibility == Visibility.Collapsed) { ShowImage(); } } else { itemImage.Source = null; // HideImage(); } };
这样处理后,无论是非图片链接,还是带图片扩展名但实际无法加载的链接,都能正确判断并避免错误显示图片区域。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

