java实现图片任意角度旋转
本文实例为大家分享了Java实现图片旋转,供大家参考,具体内容如下
方法一:普通方法实现图片旋转
/**
*图像旋转
*@paramsrc
*@paramangel
*@return
*/
publicstaticBufferedImageRotate(Imagesrc,doubleangel){
intsrc_width=src.getWidth(null);
intsrc_height=src.getHeight(null);
//calculatethenewimagesize
Rectanglerect_des=CalcRotatedSize(newRectangle(newDimension(
src_width,src_height)),angel);
BufferedImageres=null;
res=newBufferedImage(rect_des.width,rect_des.height,
BufferedImage.TYPE_3BYTE_BGR);
Graphics2Dg2=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);
returnres;
}
publicstaticRectangleCalcRotatedSize(Rectanglesrc,doubleangel){
//ifangelisgreaterthan90degree,weneedtodosomeconversion
if(angel>=90){
if(angel/90%2==1){
inttemp=src.height;
src.height=src.width;
src.width=temp;
}
angel=angel%90;
}
doubler=Math.sqrt(src.height*src.height+src.width*src.width)/2;
doublelen=2*Math.sin(Math.toRadians(angel)/2)*r;
doubleangel_alpha=(Math.PI-Math.toRadians(angel))/2;
doubleangel_dalta_width=Math.atan((double)src.height/src.width);
doubleangel_dalta_height=Math.atan((double)src.width/src.height);
intlen_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;
intlen_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;
intdes_width=src.width+len_dalta_width*2;
intdes_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;
returnnewjava.awt.Rectangle(newDimension(des_width,des_height));
}
方法二:opencv实现图片旋转
/**
*opencv实现图片旋转
*@paramsplitImage
*@paramangle
*@return
*/
publicstaticMatrotate3(MatsplitImage,doubleangle)
{
doublethera=angle*Math.PI/180;
doublea=Math.sin(thera);
doubleb=Math.cos(thera);
intwsrc=splitImage.width();
inthsrc=splitImage.height();
intwdst=(int)(hsrc*Math.abs(a)+wsrc*Math.abs(b));
inthdst=(int)(wsrc*Math.abs(a)+hsrc*Math.abs(b));
MatimgDst=newMat(hdst,wdst,splitImage.type());
Pointpt=newPoint(splitImage.cols()/2,splitImage.rows()/2);
//获取仿射变换矩阵
MataffineTrans=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);
returnimgDst;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。