代码之家  ›  专栏  ›  技术社区  ›  LoukMouk

当到图片的站点的连接不是私有的时,如何加载picturebox图片?

  •  0
  • LoukMouk  · 技术社区  · 5 年前

    我有一个ONVIF ip摄像机提供的链接,其中包含由该摄像机拍摄的快照。

    当我试图在chrome这样的浏览器上打开此链接时,会得到以下提示:

    Your connection to this site is not private

    当我试图从c#windows窗体picturebox加载此图像时,出现以下错误:

    负载:

    picturebox0.Load(mySnapUrl);

    错误:

    System.Net.WebException: 'The remote server returned an error: (401) Unauthorized.'

    输入适当的用户名和密码后,我就可以在浏览器中看到图像。

    我有没有办法把这样的图片放进画册?

    编辑1:

    我试过了 this solution 若要在手动添加凭据的web客户端上手动加载映像,在 downloadData 行。

    WebClient wc = new WebClient();
    CredentialCache cc = new CredentialCache();
    cc.Add(new Uri(mySnapUrl), "Basic", new NetworkCredential(user, password));
    wc.Credentials = cc;
    MemoryStream imgStream = new MemoryStream(wc.DownloadData(mySnapUrl));//Error
    picturebox0.Image = new System.Drawing.Bitmap(imgStream);
    
    0 回复  |  直到 5 年前
        1
  •  3
  •   LoukMouk    5 年前

    正如@Simon Mourier和@Reza Aghaei在评论中所说,我不需要添加 CredentialCache 但是只有 Credentials . 解决方案类似于 this one .

    解决方案:

    WebClient wc = new WebClient();
    wc.Credentials = new NetworkCredential(user, password);
    MemoryStream imgStream = new MemoryStream(wc.DownloadData(mySnapUrl));//Good to go!
    picturebox0.Image = new System.Drawing.Bitmap(imgStream);
    

    编辑:

    我个人必须能够异步加载上述图像,因为我以前加载图像时 picturebox0.LoadAsync(mySnapUrl) .

    我从中得到了一个大主意 source .

    为了能够使用需要凭据的图像,我创建了一个 async Task 要加载图像。。。

    private async Task<Image> GetImageAsync(string snapUrl, string user, string password)
    {
        var tcs = new TaskCompletionSource<Image>();
    
        Action actionGetImage = delegate ()
        {
            WebClient wc = new WebClient();
            wc.Credentials = new NetworkCredential(user, password);
            MemoryStream imgStream = new MemoryStream(wc.DownloadData(snapUrl));
            tcs.TrySetResult(new System.Drawing.Bitmap(imgStream));
        };
    
        await Task.Factory.StartNew(actionGetImage);
    
        return tcs.Task.Result;
    }
    

    ... 然后使用以下命令设置图像:

    var result = GetImageAsync(mySnapUrl, user, password);
    result.ContinueWith(task =>
    {
        picturebox0.Image = task.Result;
    });