Java实现图片旋转

634 阅读1分钟

大家好,我是Joy,看图醒醒眼,废话不说,开干!

方法一

1.使用的依赖

<dependency>
    <groupId>com.drewnoakes</groupId>
    <artifactId>metadata-extractor</artifactId>
    <version>2.11.0</version>
</dependency>

2.代码

import org.springframework.stereotype.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;

public class RotateImage {

    /**
     * @param src   需要旋转的图片
     * @param angel 旋转角度
     * @return
     */
    public static BufferedImage rotate(Image src, int angel) {
        int srcWidth = src.getWidth(null);
        int srcHeight = src.getHeight(null);
        // 计算新图像大小
        // 封装一个构件并指定的宽高
        Dimension dimension = new Dimension(srcWidth, srcHeight);
        // 定义一个矩形
        Rectangle oldRectangle = new Rectangle(dimension);
        Rectangle newRectangle = calcRotatedSize(oldRectangle, angel);
        BufferedImage res = new BufferedImage(newRectangle.width, newRectangle.height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = res.createGraphics();
        // 转换
        g2.translate((newRectangle.width - srcWidth) / 2,(newRectangle.height - srcHeight) / 2);
        g2.rotate(Math.toRadians(angel), srcWidth / 2, srcHeight / 2);
        g2.drawImage(src, null, null);
        return res;
    }

    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 angelAlpha = (Math.PI - Math.toRadians(angel)) / 2;
        double angelDaltaWidth = Math.atan((double) src.height / src.width);
        double angelDaltaHeight = Math.atan((double) src.width / src.height);
        int lenDaltaWidth = (int) (len * Math.cos(Math.PI - angelAlpha - angelDaltaWidth));
        int lenDaltaHeight = (int) (len * Math.cos(Math.PI - angelAlpha - angelDaltaHeight));
        int desWidth = src.width + lenDaltaWidth * 2;
        int desHeight = src.height + lenDaltaHeight * 2;
        return new java.awt.Rectangle(new Dimension(desWidth, desHeight));
    }
    public static void main(String[] args) throws IOException {
        // 将图片读入内存
        BufferedImage src = ImageIO.read(new File("D:\image\position\31.jpg"));
        // 旋转图片
        BufferedImage des = rotate(src, 270);
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
        // 输出旋转后的图片
        ImageIO.write(des, "jpg", imOut);
        InputStream inputStream = new ByteArrayInputStream(bs.toByteArray());
        OutputStream outStream = new FileOutputStream("D:\image\position\captcha2.jpg");
        IOUtils.copy(inputStream, outStream);
        inputStream.close();
        outStream.close();
    }
}

方法二(使用OpenCV)

1.代码

package com.example.demo.test;

import org.junit.Test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ImageRotate {

    @Test
    public void imageRotate(){
            System.setProperty("java.library.path", "D:\microsoft\opencv\opencv\build");
            // 加载OpenCV库
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

            // 读取原始图片
            Mat src = Imgcodecs.imread("D:\image\position\110.jpg");
            if (src.empty()) {
                System.out.println("无法读取图片");
                return;
            }
            // 定义旋转中心点
            Point center = new Point(src.cols() / 2, src.rows() / 2);
            // 定义旋转角度和缩放系数
            double angle = 50; // 旋转角度
            double scale = 1; // 缩放系数
            // 计算旋转矩阵
            Mat rot = Imgproc.getRotationMatrix2D(center, angle, scale);
            // 执行旋转操作
            Mat dst = new Mat();
            Imgproc.warpAffine(src, dst, rot, new Size(src.cols(), src.rows()));
            // 显示结果
            HighGui.imshow("旋转后的图片", dst);
            HighGui.waitKey();
        }
}

遇事不决,可问春风。春风不语,即随本心。