java实现图片任意角度旋转
作者:落日流年 发布时间:2021-05-30 12:08:23
标签:java,图片旋转
本文实例为大家分享了Java实现图片旋转,供大家参考,具体内容如下
方法一:普通方法实现图片旋转
/**
* 图像旋转
* @param src
* @param angel
* @return
*/
public static BufferedImage Rotate(Image src, double angel) {
int src_width = src.getWidth(null);
int src_height = src.getHeight(null);
// calculate the new image size
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_3BYTE_BGR);
Graphics2D g2 = res.createGraphics();
// transform
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;
}
public static Rectangle CalcRotatedSize(Rectangle src, double angel) {
// if angel is greater than 90 degree, we need to do some conversion
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));
len_dalta_width=len_dalta_width>0?len_dalta_width:-len_dalta_width;
int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha
- angel_dalta_height));
len_dalta_height=len_dalta_height>0?len_dalta_height:-len_dalta_height;
int des_width = src.width + len_dalta_width * 2;
int des_height = src.height + len_dalta_height * 2;
des_width=des_width>0?des_width:-des_width;
des_height=des_height>0?des_height:-des_height;
return new java.awt.Rectangle(new Dimension(des_width, des_height));
}
方法二:opencv实现图片旋转
/**
* opencv实现图片旋转
* @param splitImage
* @param angle
* @return
*/
public static Mat rotate3(Mat splitImage, double angle)
{
double thera = angle * Math.PI / 180;
double a = Math.sin(thera);
double b = Math.cos(thera);
int wsrc = splitImage.width();
int hsrc = splitImage.height();
int wdst = (int) (hsrc * Math.abs(a) + wsrc * Math.abs(b));
int hdst = (int) (wsrc * Math.abs(a) + hsrc * Math.abs(b));
Mat imgDst = new Mat(hdst, wdst, splitImage.type());
Point pt = new Point(splitImage.cols() / 2, splitImage.rows() / 2);
// 获取仿射变换矩阵
Mat affineTrans = Imgproc.getRotationMatrix2D(pt, angle, 1.0);
System.out.println(affineTrans.dump());
// 改变变换矩阵第三列的值
affineTrans.put(0, 2, affineTrans.get(0, 2)[0] + (wdst - wsrc) / 2);
affineTrans.put(1, 2, affineTrans.get(1, 2)[0] + (hdst - hsrc) / 2);
Imgproc.warpAffine(splitImage, imgDst, affineTrans, imgDst.size(),
Imgproc.INTER_CUBIC | Imgproc.WARP_FILL_OUTLIERS);
return imgDst;
}
来源:https://blog.csdn.net/zwl18210851801/article/details/81279622


猜你喜欢
- 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现;一、程序
- 本文实例为大家分享了Android studio实现PopupWindow弹出框的具体代码,供大家参考,具体内容如下实现步骤:第一步:自定义
- 说明本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回
- 最近在使用springboot过程中用到了mybatis-plus ,springboot版本是2.3.1.RELEASE,mybatis-
- 出现此问题的原因一般都是jar包没有被扫描到;解决办法:1、在idea的设置里面如图:如果有多个jar包文件夹就都给加进来2、一般jdk版本
- Spring Boot产生环形注入***************************APPLICATION FAILED TO STAR
- 近期用到了一位师兄写的C++程序,总体功能良好。使用不同的数据测试,发现了一个明显的缺点:大数据量下,预处理过程耗时很长。中科院的某计算集群
- 一、方法(Method)概念 1、Java 中的方法就是其他编程语言中的函数(Function) 2、方法的定义格式:①
- 本文实例讲述了Android编程中的消息机制。分享给大家供大家参考,具体如下:在分析Android消息机制之前,我们先来看一段代码:publ
- 在项目中常常常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,List
- 之前学习oracle,简单的认为数据库只存在服务器端,学习安卓之后才发现原来android和Ios本身是“携带”数据库的——SQ
- dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源工具。可以在这个地址ht
- 前言:字符串插值是一种将 表达式 插入到字符串字面量中的一种技术,又称为变量替换,变量插值,变量展开 等等,它是一种用相应值替换字符串中的一
- 记录自己用java swing做的第一个简易界面。LoginAction.javapackage com.QQUI0819;import j
- 目录1、对于A、B两种排队方式,说法正确的是2、Inter-process communication (IPC) is the trans
- List查询JAVA中从数据库中取数据,根据MyBits返回结果主要有两种类型的List,一种是List<Entity>,还一种
- 路径分隔符:Windows下是“\”unix|linux下是“/”考虑到程序的可移植性,创建文件时建议大家选用"/",因
- SpringDataJpa like查询无效这里写自定义目录标题SpringDataJpa like查询@Query(value = &qu
- 有时候需要根据条件查询得出的数据较多,需要分页显示到页面上。这时点击下一页就不方便每次带查询条件在数据库中分页。可以在list中进行分页。p
- 工作需求,要播放一张gif图片,又不想转成视频播放,就开始研究怎样解析gif,在网上也看了不少教程,最后根据自己需求写了个脚本。首先,Uni