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

本文解决了Swing中显示网络动态图片的问题,特别是处理不同格式(如BMP)的图片,通过使用BufferedImage和ImageIO.read方法实现了兼容多种格式的图片加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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();
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值