顺时针旋转图片 [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;
}