使用Httprequest从给定的URL获取图片

本文关键字:URL 获取 取图片 Httprequest 使用 | 更新日期: 2023-09-27 17:58:17

我正在尝试从网络摄像头获取图片。有一个php-python web服务可以从网络摄像头获取图片并为其提供服务:它像http://ip/jpeg/camera=1一样为图片提供服务。

private HttpWebRequest request;
private HttpWebResponse response;
private CookieContainer container;
private Uri uri;
private string _user;
private string _pass;
private string _ip;
//Login code as seen in the previous section should be here
//GetImages is meant to run as a separate thread 
private void GetImages(string camNo)
{
//create the GET request for the JPEG snapshot (found at /jpeg on the IP Camera)
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + deviceIP + "/jpeg/camera"+camNo);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = container;
//attempt to get a response from the IP110, event if error
try
{
    response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
    ConnectionError(new ConnectionErrorEventArgs(e.Message));
}
//Get the stream containing the JPEG image.
Stream stream = response.GetResponseStream();
//Read the stream to memory.
byte[] buffer = new byte[100000];
int read, total = 0;
while ((read = stream.Read(buffer, total, 1000)) != 0)
{
    total += read;
}
//create a BMP image from the stream
Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, 0, total));
//send the bmp image to where you would like to display it. 
 }

然后我将位图以jpeg格式存储到文件夹中。我的问题从这里开始;我想尽快完成这个过程。我想用这个代码从50个网络摄像头上拍摄照片,并存储为jpeg,而且必须很快——我的意思是,每10秒我就必须从50个摄像头上获取新照片。

我使用了时间控制,每500毫秒给它500毫秒。程序使用上面的代码直到相机数字并保存jpeg,但它一个接一个地工作,因此性能变低!

50ms x 500凸轮=25000毫秒(25秒),如果我安排定时器控制的间隔100毫秒程序冻结。当我使用上面的代码时,我在200毫秒内得到位图bmp,但当它试图在光盘上以jpeg格式写入时,需要很长时间。

我该怎么做才能更快地写入磁盘?我查找映射的内存,这有帮助吗?我想把图片储存在光盘上,因为我会把这些图片放在网站上分享给别人。我可以使用内存映射并通过网站公开提供吗?

更新:我还将WebClient类用于异步工作,http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=571

结果是:获得300毫秒的图片并将其写入磁盘约700毫秒所以我必须找到一个尽可能多地写入磁盘的解决方案。

哪一个更好?要将图片写入磁盘还是将图像发送到数据库?我试着把图片储存起来,以便随时可以使用,因为人们必须在网站上看到更新的图片。哪一个更适合成千上万的客户端查询?将它们存储在磁盘上还是将它们作为二进制文件存储在数据库中?

使用Httprequest从给定的URL获取图片

获取图像的代码是同步的。我建议修改您的代码,使用HttpWebRequest.BeginGetResponse()来获取您的图像,如本答案中所述。

因此,当你的(单个)计时器触发时,开始向你的摄像头发出异步请求,然后(当它们完成时)每个完成的请求都会触发回调,你可以保存返回的图像。

如果需要进一步优化,则可以将图像保存到磁盘委派到后台ThreadPool工作项。

任何时候,如果您需要以比堆叠响应允许的速度更快的速度返回响应,那么您最终都必须使用多个线程同时完成多个工作(最后一句话是这里的线索)。

在。NET,这意味着要么建立自己的线程库,要么使用TPL等。

ADDED:正如下面的评论所指出的,这可能意味着使用异步调用,并允许框架隐式地为您创建线程,而不是自己控制它们。事实上,您可以使用线程池,但仍然可以选择异步或同步,而无需控制创建的线程数。如果你真的想深入到金属层,你甚至可以使用操作系统级别的中断处理程序将线程卸载到操作系统(例如,Ruby在1.9之前使用的一种方法,它引入了"真正"的线程而不是"绿色"的线程——是的,TMI)。

答案仍然成立——如果你有2分钟的工作要完成,30秒的时间要完成,你需要一个多线程的解决方案,无论你是否意识到你实际上在线程化(显式创建)(由framework/OS处理的隐式创建)。