大家好,我是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();
}
}
遇事不决,可问春风。春风不语,即随本心。