`

在Swing的Label中显示网络读取的BMP图像数组

 
阅读更多

在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();
 
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics