java关于图片显示的操作
1.JLabel显示(原尺寸)图片(或摄像头到的一帧)
JLabel labImg = new JLabel();
Image fileImg = new ImageIcon("F:\\facin.jpg").getImage();
labImg.setIcon(new ImageIcon("F:\\facin.jpg"));
labImg.setBounds(60,100,fileImg.getWidth(null),fileImg .getHeight(null));
add(labImg);
我一般显示一张图片一般选择的是JLabel类,这里用到了一个常用的Image类:ImageIcon
注:显示摄像头图像帧一般要,将Mat转化为BufferedImage在,因为在OpenCV中只有Mat,没有BufferedImage,BufferedImage是Image的实现类,Image是个抽象方法,后面我会补充二者的转换
Image fileImg = new ImageIcon("F:\\facin.jpg").getImage();
这样就可以简化操作,避免手动读取文件流,转化为缓冲流图片,直接得到缓冲图片;
2.Image按比例缩放
上面是通过JLabel显示一张原比例图片,但是想对图片按比例缩放,怎么操作
我写了一个工具方法,如下
public static Image imageScale(Image image,double wScale,double hScale){
if(wScale<0||hScale<0){
wScale=1.0;
hScale=1.0;
}
BufferedImage targetImg = new BufferedImage((int)(wScale*image.getWidth(null)),
(int)(hScale*image.getHeight(null)),BufferedImage.TYPE_INT_ARGB);
Graphics2D gra = (Graphics2D)targetImg.getGraphics();
gra.scale(wScale,hScale);
gra.drawImage(image,0,0,null);
return targetImg;
}
BufferedImage最灵活的操作莫过于使用Graphics了,对图像进行很多复杂地编辑操作,这里是介绍它的比例缩放
gra.scale():按照给定倍数对宽高进行缩放,参数是实型;
drawImage(image,0,0,null):这是关键的操作,实现之前Graphics执行的操作,得到image对象
给出测试代码:
//主题图片
JLabel labImg = new JLabel();
Image fileImg = new ImageIcon("F:\\AI酒店\\SDK的test图片\\facin.jpg").getImage();
Image titleImg = ImageTools.imageScale(fileImg, 0.6, 0.2);
labImg.setIcon(new ImageIcon(titleImg));
labImg.setBounds(60,100,titleImg.getWidth(null),titleImg.getHeight(null));
add(labImg);
原图:
缩放效果:
3.将Mat转化为Image
使用opencv就要涉及到Mat类,而且读取摄像头最常用的方式就是使用opencv,但是在java gui中只有image图像类可以使用,所以把Mat转化为Image就变得很关键
public static Image toBufferImage(Mat mat){
//类型
int type= mat.channels()==1?BufferedImage.TYPE_BYTE_GRAY:BufferedImage.TYPE_3BYTE_BGR;
//字节大小
int bufferSize =mat.cols() * mat.rows() * mat.channels();
//获取图片内容
byte[] buffer = new byte[bufferSize];
mat.get(0,0,buffer);
BufferedImage image =new BufferedImage(mat.cols(),mat.rows(),type);
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);
return image;
}
Image BufferedImage(列数,行数,图像类型) :得到给定像素尺寸的空白Image
((DataBufferByte)image.getRaster().getDataBuffer()).getData() :得到image实例的二进制格式数据;
4.缩放Mat图片
对Mat缩放操作:
public static Mat resize(Mat img, double times) {
Size size =new Size(img.width()*times,img.height()*times);
//建立目标大小的图片
Mat targetImg=new Mat(size,img.type());
Imgproc.resize(img,targetImg,size);
return targetImg;
}
times是满足保持原图宽高比例进行缩放,也可以改成分别设定宽高的缩放比例