在SWING中显示网络上动态生成的图片,
我起初直接用
ImageIcon ic = new ImageIcon(data);//data为网络直接读取来的byte数组
lblNewLabel_1.setIcon(ic);
lblNewLabel_1.repaint();
结果发现经常会遇到有些图片出不来,查了好半天,而且找错还真不好找,因为他不在具体的位置抛异常。抛了个根本找不到源的异常
后来仔细寻找,才发现,动态的图片数组格式有差异,有JPG,有PNG,也有BMP,结果发现BMP的显不出,而且有问题。
网上有BMP转JPG图片的代码,但那天只是文件及格式间转换,我还是不太想这样做。但从这代码里发现一个
image = Toolkit.getDefaultToolkit().createImage(
new MemoryImageSource(bh.iWidth, bh.iHeight, ndata, 0,
bh.iWidth));
因为Swing中ImageIcon好像构造方法是中可以为Image对象的,但Toolkit中createImage的ImageProducer这个参数又不知从何而来。
又发现 BufferImage bi=ImageIo.read(inputstream);
而bi.getSource()这个方法返回的对象就是ImageProducer。
似乎发现有办法解决。
于是,我写成下面这样就搞定了。
BufferedImage bi = ImageIO.read(new ByteArrayInputStream(image));
ImageIcon ic = new ImageIcon(Toolkit.getDefaultToolkit().createImage(bi.getSource()));
lblNewLabel_1.setIcon(ic);
lblNewLabel_1.repaint();
其次,我发现用httpclient中取的inputstream取图标的长度有问题。
我之前喜欢直接用byte data[]=new byte[is.available];is.read(data);
但发现这样不行,容易报错。
所以还是乖乖的这样用
InputStream is = entity.getContent();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=is.read(buffer))!=-1){
baos.write(buffer, 0, len);
}
byte[] data = baos.toByteArray();