[英]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;
}
(其中imageType
是BufferedImage
声明的常量之一。很可能是TYPE_INT_RGB
。
否则,您的第一种方法就可以了。
我建议采用第一种(高级)方法,而不是第二种(低级)方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.