当图像站点的连接不是私有时如何加载图片框图像?
How to load picturebox image when the connection to the image's site is not private?
我有一个由 ONVIF 网络摄像头提供的 link,其中包含由所述摄像头拍摄的快照。
当我尝试在 chrome 等浏览器上打开此 link 时,我收到以下提示:
当我尝试从 c# windows 窗体图片框加载此图像时,出现以下错误:
加载:
picturebox0.Load(mySnapUrl);
错误:
System.Net.WebException: 'The remote server returned an error: (401) Unauthorized.'
输入正确的用户名和密码后,我可以在浏览器中看到图像。
有什么方法可以在图片框中加载这样的图像吗?
编辑 1:
我尝试 this solution 在 Web 客户端上手动加载图像,我在其中手动添加了凭据,但我仍然在 downloadData
行遇到相同的错误。
var webClient = new WebClient();
var credentialCache = new CredentialCache();
credentialCache.Add(new Uri(mySnapUrl), "Basic", new NetworkCredential(user, password));
webClient.Credentials = credentialCache;
var imgStream = new MemoryStream(webClient.DownloadData(mySnapUrl));//Error
picturebox0.Image = new System.Drawing.Bitmap(imgStream);
正如@Simon Mourier 和@Reza Aghaei 在评论中所说,我不需要添加 CredentialCache
,只需添加 Credentials
。解决方法类似于this one.
解法:
var webClient = new WebClient();
webClient.Credentials = new NetworkCredential(user, password);
var imgStream = new MemoryStream(webClient.DownloadData(mySnapUrl));//Good to go!
picturebox0.Image = new System.Drawing.Bitmap(imgStream);
编辑:
我个人必须能够异步加载所述图像,因为我曾经使用 picturebox0.LoadAsync(mySnapUrl)
.
加载我的图像
我从这个 得到了一个重要的想法。
为了能够与需要凭据的图像相同,我创建了一个 async Task
来加载图像...
private async Task<Image> GetImageAsync(string snapUrl, string user, string password)
{
var tcs = new TaskCompletionSource<Image>();
Action actionGetImage = delegate ()
{
var webClient = new WebClient();
webClient.Credentials = new NetworkCredential(user, password);
var imgStream = new MemoryStream(webClient.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;
});
我有一个由 ONVIF 网络摄像头提供的 link,其中包含由所述摄像头拍摄的快照。
当我尝试在 chrome 等浏览器上打开此 link 时,我收到以下提示:
当我尝试从 c# windows 窗体图片框加载此图像时,出现以下错误:
加载:
picturebox0.Load(mySnapUrl);
错误:
System.Net.WebException: 'The remote server returned an error: (401) Unauthorized.'
输入正确的用户名和密码后,我可以在浏览器中看到图像。
有什么方法可以在图片框中加载这样的图像吗?
编辑 1:
我尝试 this solution 在 Web 客户端上手动加载图像,我在其中手动添加了凭据,但我仍然在 downloadData
行遇到相同的错误。
var webClient = new WebClient();
var credentialCache = new CredentialCache();
credentialCache.Add(new Uri(mySnapUrl), "Basic", new NetworkCredential(user, password));
webClient.Credentials = credentialCache;
var imgStream = new MemoryStream(webClient.DownloadData(mySnapUrl));//Error
picturebox0.Image = new System.Drawing.Bitmap(imgStream);
正如@Simon Mourier 和@Reza Aghaei 在评论中所说,我不需要添加 CredentialCache
,只需添加 Credentials
。解决方法类似于this one.
解法:
var webClient = new WebClient();
webClient.Credentials = new NetworkCredential(user, password);
var imgStream = new MemoryStream(webClient.DownloadData(mySnapUrl));//Good to go!
picturebox0.Image = new System.Drawing.Bitmap(imgStream);
编辑:
我个人必须能够异步加载所述图像,因为我曾经使用 picturebox0.LoadAsync(mySnapUrl)
.
我从这个
为了能够与需要凭据的图像相同,我创建了一个 async Task
来加载图像...
private async Task<Image> GetImageAsync(string snapUrl, string user, string password)
{
var tcs = new TaskCompletionSource<Image>();
Action actionGetImage = delegate ()
{
var webClient = new WebClient();
webClient.Credentials = new NetworkCredential(user, password);
var imgStream = new MemoryStream(webClient.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;
});