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

Xamarin调用Azure计算机视觉API报错:DescribeImageInStreamAsync返回NotFound

解决Azure计算机视觉API调用"Not Found"错误及图像描述失效问题

看起来你遇到的核心问题是调用DescribeImageInStreamAsync时触发了Not Found异常,同时图像描述功能完全没输出。咱们一步步拆解问题并修复:

一、先搞定最直接的"Not Found"问题

这个错误90%和Azure服务的配置有关,你得先确认这几点:

  • API密钥和端点不能留空:你代码里new ApiKeyServiceClientCredentials("")和visionapi.Endpoint = ""都是空字符串,这肯定不行。去Azure门户找到你的计算机视觉资源,复制正确的密钥(有两个密钥,随便用哪个都行)和端点URL(格式一般是https://<你的资源区域>.cognitiveservices.azure.com/)填进去。
  • 端点区域要匹配:比如你的资源部署在East US,端点就得是https://eastus.cognitiveservices.azure.com/,区域不匹配绝对会返回Not Found。

二、修复流读取的隐形坑

你代码里连续两次调用file.GetStream():第一次给ImageView显示图片,第二次传给API。但Stream读取后,Position会自动跳到末尾,第二次读取时就没数据了,这也会导致API调用失败。解决方法有两种:

// 方法1:重置流的位置(适合支持重置的流)
var stream = file.GetStream();
img.Source = ImageSource.FromStream(() => stream);
stream.Position = 0; // 把指针拉回开头,API就能读到完整图像了

// 方法2:重新获取流(更稳妥,避免某些流不支持Position操作)
img.Source = ImageSource.FromStream(() => file.GetStream());
var apiStream = file.GetStream(); // 重新拿一个新的流实例给API

三、完善异常处理,别再当"睁眼瞎"

你现在的catch块只显示"ERROR",根本看不到具体错误细节,调试起来太费劲。改成这样,能帮你快速定位问题:

catch (Exception ex)
{
    await DisplayAlert("错误详情", $"错误类型:{ex.GetType().Name}\n错误信息:{ex.Message}", "OK");
}

四、修改后的完整代码示例

结合上面的修复,你的代码可以改成这样(记得替换成自己的密钥和端点):

private async void Button_Clicked(object sender, EventArgs e)
{
    await CrossMedia.Current.Initialize();
    try
    {
        if (!CrossMedia.Current.IsTakePhotoSupported && !CrossMedia.Current.IsPickPhotoSupported)
        {
            await DisplayAlert("INFO", "CAMERA NOT AVAILABLE", "OK");
            return;
        }

        var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
        {
            Directory = "Images",
            Name = "test.jpg"
        });

        if (file == null)
        {
            await DisplayAlert("ERROR", "FILE NOT FOUND", "OK");
            return;
        }

        // 显示图片并重置流位置
        var stream = file.GetStream();
        img.Source = ImageSource.FromStream(() => stream);
        stream.Position = 0;

        // 初始化计算机视觉客户端(替换成你的密钥和端点)
        var apiKey = "你的Azure计算机视觉API密钥";
        var endpoint = "你的Azure计算机视觉端点URL";
        var visionapi = new ComputerVisionClient(new ApiKeyServiceClientCredentials(apiKey))
        {
            Endpoint = endpoint
        };

        // 调用图像描述API
        var desc = await visionapi.DescribeImageInStreamAsync(stream);
        
        // 拼接字幕并显示(加上置信度更直观)
        cap.Text = string.Empty;
        foreach (var caption in desc.Captions)
        {
            cap.Text += $"\n{caption.Text} (置信度:{caption.Confidence:P2})";
        }

        // 如果没生成字幕,给个提示
        if (string.IsNullOrEmpty(cap.Text))
        {
            cap.Text = "未生成有效图像描述";
        }
    }
    catch (Exception ex)
    {
        await DisplayAlert("错误详情", $"错误类型:{ex.GetType().Name}\n错误信息:{ex.Message}", "OK");
    }
}

额外检查点

  • Azure资源防火墙规则:确认你的应用所在网络(比如手机的移动网络)被允许访问这个计算机视觉资源,防火墙限制也会导致Not Found。
  • API调用限额:如果用的是免费层资源,可能已经达到调用次数上限,去Azure门户看看资源的使用情况。

内容的提问来源于stack exchange,提问作者user11640506

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:09:58