2013-11-26 97 views
0

我必須寫的servlet其捕獲從在線網絡攝像頭幾張圖片。每個參數(URL,Interval,numer和count)都是通過POST方法發送的。在我的servlet文件我有類似的東西:Java的緩衝圖片形式的在線網絡攝像頭

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String url = request. getParameter("url").toString(); 
    int interwal = Integer.parseInt(request.getParameter("interwal").toString()); 
    int nrSt = Integer.parseInt(request.getParameter("nr").toString()); 
    int il = Integer.parseInt(request.getParameter("il").toString()); 
    PrintWriter out = response.getWriter(); 
    BufferedImage img; 
    URL imgURL; 
    File imgFile; 
    for(int i=0; i<il; i++){ 
     try{ 
      imgURL = new URL(url); 
      img = ImageIO.read(imgURL); 
      imgFile = new File("E:\\image" + (nrSt+i) + ".jpg"); 
      ImageIO.write(img, "png", imgFile); 
      out.print("Saved image" + (nrSt+i) + ".jpg<br>"); 
     } catch(IOException e){ 
      out.print("Error reading Image!"); 
      e.printStackTrace(); 
     } 
     try { 
      Thread.sleep(interwal*1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我必須改變,以捕捉圖像形式examle這個攝像頭:cam

回答

0

使用網絡攝像頭頁面可能要困難得多。您選擇的示例使用的是使用JavaScript在頁面上計算的動態圖像URL - 但它非常簡單,可以輕鬆提取所需內容。接下來的問題是,圖片網址指向一個服務,該服務使用ImageIO.read()似乎無法理解的多部分響應來回答。

下面的獨立代碼似乎已成功獲得網絡攝像頭圖像:

public static void main(String[] args) { 
    try { 
     // get webcam page 
     URL url = new URL("...your example URL.../webcam/campob.html"); 
     InputStreamReader isr = new InputStreamReader(url.openStream(), "UTF-8"); 
     Scanner scanner = new Scanner(isr); 
     final Pattern nullDelimiter = Pattern.compile("<<<>>>"); 
     String html = scanner.useDelimiter(nullDelimiter).next(); 
     scanner.close(); 

     // extract image URL from HTML 
     final Pattern extractPattern = Pattern.compile(
       "^var BaseURL = \"([^\"]+)\".*" 
       + "^var ImageResolution = \"([^\"]+)\".*" 
       + "^var File = \"([^\"]+)\"", 
       Pattern.MULTILINE|Pattern.DOTALL); 
     Matcher m = extractPattern.matcher(html); 
     if (!m.find()) throw new RuntimeException(); 
     URL imgURL = new URL(m.group(1) + m.group(3) + m.group(2)); 
     System.out.println("imgURL=" + imgURL); 

     // read headers into buffer 
     InputStream is = imgURL.openStream(); 
     byte[] buffer = new byte[131072]; 
     int bytes = 0; 
     Pattern headersPattern = Pattern.compile(
       "^Content-Length:\\s*(\\d+)\\s*$.*?^$\\r?\\n", 
       Pattern.MULTILINE|Pattern.DOTALL); 
     while (bytes < buffer.length) { 
      int count = is.read(buffer, bytes, buffer.length - bytes); 
      if (count < 0) break; 
      bytes += count; 
      m = headersPattern.matcher(new String(buffer, "ASCII")); 
      if (m.find()) break; 
     } 

     // read rest of image bytes into buffer 
     int offset = m.end(); 
     int contentLength = Integer.parseInt(m.group(1)); 
     int limit = Math.min(buffer.length, offset + contentLength); 
     while (bytes < limit) { 
      int count = is.read(buffer, bytes, limit - bytes); 
      if (count < 0) break; 
      bytes += count; 
     } 
     is.close(); 
     System.out.println("bytes=" + bytes + " offset=" + offset); 

     // read image from buffer (start after header) 
     is = new ByteArrayInputStream(buffer); 
     is.skip(offset); 
     Image img = ImageIO.read(is); 
     System.out.println(img); 
    } catch (Exception ex) { 
     ex.printStackTrace(System.err); 
    } 
} 

注意,代碼是缺乏真正的錯誤處理,緩衝區有固定的大小等