Javaは画像を時計回りに回転させます

画像を時計回りに回転させます[270°180°90°]

/**
     * 对图片进行旋转
     *
     * @param src   被旋转图片
     * @param angel 旋转角度
     * @return 旋转后的图片
     */
    public static BufferedImage Rotate(Image src, int angel) {
    
    
        int src_width = src.getWidth(null);
        int src_height = src.getHeight(null);
        // 旋转后图片
        Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(
                src_width, src_height)), angel);
        BufferedImage res = null;
        res = new BufferedImage(rect_des.width, rect_des.height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = res.createGraphics();
        // 转换
        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);
        return res;
    }

    /**
     * 旋转后的图片
     *
     * @param src   被旋转的图片
     * @param angel 旋转角度
     * @return 旋转后的图片
     */
    public static Rectangle CalcRotatedSize(Rectangle src, int angel) {
    
    
        // 如果旋转的角度大于90度做相应的转换
        if (angel >= 90) {
    
    
            if (angel / 90 % 2 == 1) {
    
    
                int temp = src.height;
                src.height = src.width;
                src.width = temp;
            }
            angel = angel % 90;
        }

        double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2;
        double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;
        double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2;
        double angel_dalta_width = Math.atan((double) src.height / src.width);
        double angel_dalta_height = Math.atan((double) src.width / src.height);

        int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha
                - angel_dalta_width));
        int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha
                - angel_dalta_height));
        int des_width = src.width + len_dalta_width * 2;
        int des_height = src.height + len_dalta_height * 2;
        return new Rectangle(new Dimension(des_width, des_height));
    }

使用する

@Override
    public byte[] testImgRotate(MultipartFile face) throws Exception {
    
    
        byte[] IdCartFace;
        if (face.getSize() > 300000) {
    
    //压缩
            IdCartFace = ImageUtils.imageSet(face.getBytes());
        } else {
    
    
            IdCartFace = face.getBytes();
        }
        String imgFace = Base64.encode(IdCartFace).trim();//图片加密
        /**
         * 图片人脸角度识别+旋转处理
         */
        int angel = faceDetect(imgFace);//返回旋转角度值 270 180 90
        BufferedImage src = ImageIO.read(face.getInputStream());
        //TODO 区间旋转
        //顺时针旋转xx度
        BufferedImage des1 = RotateImage.Rotate(src, angel);
		//int mn = (int) (Math.random() * (100 - 2) + 2);
        //ImageIO.write(des1, "jpg", new File("E:\\proj\\imagexz\\" + mn + ".jpg"));
        //转byte
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        //转换编码格式JPEG
        ImageIO.write(des1, "jpeg", out);
        byte[] re = out.toByteArray();
        return re;
    }

おすすめ

転載: blog.csdn.net/qq_42476834/article/details/108887038