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是滿足保持原圖寬高比例進行縮放,也可以改成分別設定寬高的縮放比例