繁体   English   中英

如何将JPEG从URL保存到文件?

[英]How can I save a JPEG from a URL to a file?

我正在尝试使用Java将URL中的JPEG图像保存到文件中。 网址: http//150.214.222.100//axis-cgi/mjpg/video.cgi?resolution = 640x480&compression = 1&duration = 1&timeout =&dummy = garb

我尝试了以下方法:1)

Image image = fetchImage(urlNorthView);

saveImage2Disk(image);

public static Image fetchImage( URL u ) throws MalformedURLException, IOException   {
      Toolkit tk = Toolkit.getDefaultToolkit();
      return tk.createImage(u );
}

private void saveImage2Disk(Image Image) throws IOException{
        File outputFile = new File("urlNorthView"+Calendar.getInstance().getTimeInMillis()+".jpg");

        BufferedImage bufferedImage = new BufferedImage(Image.getWidth(null),Image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bufferedImage.createGraphics();
        g2.drawImage(Image, null, null);
        ImageIO.write(bufferedImage, "jpg", outputFile);
    }

=>例外:“宽度(-1)和高度(-1)不能<= 0”

2)

inputStream2Disk((InputStream) urlNorthView.getContent());

private void inputStream2Disk(InputStream in) throws Exception{
        File outputFile = new File("urlNorthView"+Calendar.getInstance().getTimeInMillis()+".jpg");
        OutputStream out=new FileOutputStream(outputFile);
        byte buf[]=new byte[1024];
        int len;
        while((len=in.read(buf))>0)
        out.write(buf,0,len);
        out.close();
        in.close();
    }

该文件已损坏。 当我用Kate打开它时,我可以看到:

--myboundary内容类型:image / jpeg内容长度:38256 ....

二进制文件中不应包含任何文本。

可能是什么问题?

由于某种原因,http响应正文在请求该图像时包含一个mime部分(mime部分对于将多个文件放入单个响应非常有用)。 在此响应中,只有一个mime部分,因此它几乎没有用。

如果愿意,您可以使用javax.mail软件包中的代码来正确解析此代码,但这不是一个很好的api,恕我直言。

另外,您可以通过多种方式自己修改代码中的内容。 由于只有一个哑剧部分,因此您可以从输入流的开头丢弃数据,直到连续看到两个换行符(字节等于10)为止。 这应该可行,因为mime标头应该是7位ASCII码iirc,因此无需担心字符编码。

这是一些示例代码:

URLConnection conn = urlNorthView.openConnection();
InputStream in = conn.getInputStream();
String contentType = conn.getHeaderField("Content-Type");
if (!"image/jpeg".equals(contentType)) {
    // hack: assuming it's mime if not a raw image
    int one = in.read();
    if (one == -1) {
        // stop??
    }
    int two = in.read();
    while (two != -1 && !(two == 10 && one == 10)) {
        one = two;
        two = in.read();
    }
}
// if it was mime, we've stripped off the mime headers
// and should now get the image
inputStream2Disk(in);

编辑:废话,而不是两个\\ n,您将看到两个\\ r \\ n,或字节0x0d,0x0a,0x0d,0x0a。 丢弃数据,直到您看到此模式作为练习供读者阅读;)

尝试以下方法将Image转换为BufferedImage

private static BufferedImage getBufferedImage(Image img, int imageType) {
    if (img instanceof BufferedImage) {
        return (BufferedImage) img;
    }

     BufferedImage bi = new BufferedImage(img.getWidth(null), img
             .getHeight(null), imageType);

     Graphics2D g = (Graphics2D) bi.getGraphics();
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
             RenderingHints.VALUE_ANTIALIAS_ON);

     g.drawImage(img, 0, 0, null);
     g.dispose();

     return bi;
 }

(其中imageTypeBufferedImage声明的常量之一。很可能是TYPE_INT_RGB

否则,您的第一种方法就可以了。

我建议采用第一种(高级)方法,而不是第二种(低级)方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM