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是满足保持原图宽高比例进行缩放,也可以改成分别设定宽高的缩放比例

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值