使用ImageIo读取图片时,有时候会出现一层红色遮罩,起初以为是自己程序出问题,上网查了下,有人说是JAVA的BUG,
http://blog.csdn.net/shixing_11/article/details/6897871这篇文章中介绍的是利用ToolKit.getImage方法替代ImageIo的read方法,但由于我要读取的网络图片,尽管ToolKit有提供通过url获取图片的方法,但由于有些网站需要UA和其他字段的验证,所以只能自己获取图片字节数组,但数组要转换成Image对象又要通过ImageIo的read方法,所以不得不另寻他路,在类ImageIcon中发现了ImageIcon(byte[] imageData) 构造函数,虽然ImageIcon没有实现Image接口但提供了一个返回Image对象的函数,试了一下,可以正常读取图像,而且画质和ImageIo没什么差别,代码如下
1 package org.fzu.datamaker.gui.util;
2
3 import java.awt.Image;
4 import java.io.InputStream;
5 import java.net.HttpURLConnection;
6 import java.net.URL;
7
8 import javax.swing.ImageIcon;
9
10 public class HttpImage {
11 private Image image;
12 private byte[]buf;
13 private static HttpImage httpImage;
14 private boolean stop=false;
15 public HttpImage()
16 {
17 buf=new byte[1024*1024*3];
18 }
19 public static HttpImage getHttpImage()
20 {
21 if(httpImage==null)
22 httpImage=new HttpImage();
23 return httpImage;
24 }
25 public Image getImage(String addr)
26 {
27 stop = false;
28 image = null;
29 HttpURLConnection conn = null;
30 InputStream in = null;
31 try {
32 URL url = new URL(addr);
33 conn = (HttpURLConnection) url.openConnection();
34 conn.setConnectTimeout(10 * 1000); // 10秒的连接超时
35 conn.setReadTimeout(15 * 1000); // 15秒的读取超时
36 conn.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
37 conn.setDoInput(true);
38 conn.connect();
39 in = conn.getInputStream();
40 int readlen = 0;
41 int contentlen = 0;
42 do {
43 // 一次读取10KB,如果返回值小于0可以认为一定读取完毕
44 contentlen += readlen;
45 readlen = in.read(buf, contentlen, 1024 * 10);
46 if (stop) {
47 in.close();
48 conn.disconnect();
49 return null;
50 }
51 } while (readlen > 0);
52 in.close();
53 conn.disconnect();
54 // image = ImageIO.read(new ByteArrayInputStream(buf));
55 image=(new ImageIcon(buf)).getImage(); //利用ImageIcon获取Image对象
56 } catch (Exception e) {
57 image = null;
58 e.printStackTrace();
59 try {
60 in.close();
61 conn.disconnect();
62 } catch (Exception ex) {
63 }
64 }
65 return image;
66 }
67 public void stop()
68 {
69 this.stop=true;
70 }
71
72 } |