You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:17:14