JavaFx项目图片处理功能清单,图片偏转1度,OpenCV函数实现

本文介绍了一种使用OpenCV实现的图片旋转方法,包括无损旋转和普通旋转,通过调整角度参数,可以实现图像的水平和垂直旋转。代码示例展示了如何读取图片,应用旋转并保存结果。

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

图片偏转分为两种,一种是无损偏转,另一种是普通偏转
在这里插入图片描述
代码:

	public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        System.out.println("加载64位的opencv成功!");

        Mat srcImage = imread("F:\\test\\1.jpg");
        
        // 参数可以指定0到360度。水平旋转就是180度,垂直旋转是90度或者270度
        Mat dstImage = ImageHelper.RotateNew_bak(srcImage, 8);
        // angle:向左偏是1到180度,向右偏是-1到-180度
        Mat dstImage2 = ImageHelper.RotateNew(srcImage, -8);

        imwrite("F:\\test\\1-dstImage.jpg", dstImage);
        imwrite("F:\\test\\1-dstImage2.jpg", dstImage2);
	}
	
    /**
     * 参数可以指定0到360度。水平旋转就是180度,垂直旋转是90度或者270度
     * @param srcMat
     * @param angel
     * @return
     */
    public static Mat RotateNew_bak(Mat srcMat, double angel) {

        BufferedImage src = ImageDeskew.mat2BufferedImage(srcMat);

        int src_width = src.getWidth(null);
        int src_height = src.getHeight(null);
        // 计算旋转后图片的尺寸
        Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(src_width, src_height)), (int) angel);
        BufferedImage res = null;
        res = new BufferedImage(rect_des.width, rect_des.height, src.getType());
        Graphics2D g2 = res.createGraphics();

        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);

        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, rect_des.width, rect_des.height);

        // 进行转换
        g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2);
        g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);

        g2.drawImage(src, null, null);


        g2.dispose();

        byte[] pixels = ( (DataBufferByte) res.getRaster().getDataBuffer()).getData();

        // Create a Matrix the same size of image
        Mat I = new Mat(res.getHeight(), res.getWidth(), CvType.CV_8UC3);
        // Fill Matrix with image values
        I.put(0, 0, pixels);
        return I;
    }
    
    /**
     * angel:左偏是1到180度,向右偏是-1到-180度
     * @param srcMat
     * @param angel
     * @return
     */
    public static Mat RotateNew(Mat srcMat, double angel) {
        Mat dst = srcMat.clone();
        Point center = new Point(srcMat.width()/2.0,srcMat.height()/2.0);
        Mat mat1 = Imgproc.getRotationMatrix2D(center, angel, 1.0);
        Imgproc.warpAffine(srcMat,dst,mat1,dst.size(),Imgproc.INTER_NEAREST,BORDER_CONSTANT,new Scalar(255,255,255));
        mat1 = null;
        center = null;
        return dst;
    }

效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小言W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值