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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。