【OpenCV】 Java获取像素点的RGB值

本文介绍了一个使用Java Swing实现的简单图片显示组件。通过继承JComponent并重写paintComponent方法,实现了图片的加载和显示。此外,还提供了一个imshow方法用于创建窗口并展示图片。

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

今天照着大佬视频写了个图片显示器,一点点的java图形界面知识就可以啦

public class ImageUI extends JComponent{
	private BufferedImage image;
	public ImageUI() {
		this.image = null;
	}
	
	@Override
	protected void paintComponent(Graphics g) {   
		Graphics2D g2d = (Graphics2D)g;
		if(image == null) {
			g2d.setPaint(Color.BLACK);
			g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
		}else {
			g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
		}
	}
	
	public void imshow(String title,Mat src) {
		this.image = convert2BufferedImage(src);
		JDialog ui = new JDialog();
		ui.getContentPane().setLayout(new BorderLayout());
		ui.getContentPane().add(this, BorderLayout.CENTER);
		ui.setTitle(title);
		ui.setSize(image.getWidth(), image.getHeight());
		ui.setVisible(true);
		this.repaint();		//重新加载
	}

	private BufferedImage convert2BufferedImage(Mat src) {
		// TODO Auto-generated method stub
		int width = src.cols();
		int height = src.rows();
		int dims = src.channels();
		byte[] data = new byte[width * height * dims];
		src.get(0, 0, data);
		int[] pixels = new int[width * height];
		
		BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
		int r = 0, g = 0, b = 0;
		int index = 0;
		for(int row = 0; row < height; row++) {
			for(int col = 0; col < width; col++) {
				index = row * width * dims + col * dims;
				if(dims == 3) {
					b = data[index]&0xff;
					g = data[index+1]&0xff;
					r = data[index+2]&0xff;
					pixels[row * width + col] = ((255&0xff) << 24) | ((r&0xff) << 16) | ((g&0xff) << 8) | (b&0xff);
				}else if(dims == 1) {
					b = data[index]&0xff;
					pixels[row * width + col] = ((255&0xff) << 24) | ((b&0xff) << 16) | ((b&0xff) << 8) | (b&0xff);
				}
			}
		}
		bi.getRaster().setDataElements(0, 0, width, height, pixels);
		return bi;
	}
}

有了这个的话,就更加直观啦! 

 

其实也就是将图片的RGB信息放进pixel里面,获取像素点的RGB值

PS :1. &0xff 为了保证二进制数据的一致性(在上一篇博文已经提过 点此查看

         2. ((255&0xff) << 24) | ((r&0xff) << 16) | ((g&0xff) << 8) | (r&0xff) 移位问题,不再赘述,如下(一个pixel的位数);

è¿éåå¾çæè¿°

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值