我有一个由ONVIF ip摄像机提供的链接,其中包含该摄像机拍摄的快照。
当我尝试在chrome等浏览器上打开此链接时,出现以下提示:
当我尝试从C#Windows窗体的图片框加载该图像时,出现以下错误:
加载:
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 :(得分:3)
正如@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;
});