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

發佈了30 篇原創文章 · 獲贊 21 · 訪問量 8075
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章