这篇文章主要为大家详细介绍了Java实现图片翻转以及任意角度旋转,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
最近几天在做一个项目,因为涉及到了图片(绝大部分都不是整图,是把一张张的大图切成小图,也就是title)的翻转以及90°旋转,弄得焦头烂额。在网上搜索好几天,发现用到的方法都是比较公式化的,对于只是在绘图的时候需要显示翻转而不需要另外生成图片的情况,这些代码用起来非常的麻烦。最后仔细的研究了一下jdk文档,用graphics2d很简单的就实现了以下功能:
1、图片的翻转,包括水平翻转以及垂直翻转
2、图片的任意角度旋转。因为工程需要,代码里面都直接写成了+90,根据需要,可以对这个值进行改动,以符合需求。
3、可以使用组合操作,比如水平翻转+旋转,或者垂直+水平+旋转,任意。
以下是代码:package demo628;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class imagerote
{
public static void main(string[] args)
{
jframe frame = new transformframe();
frame.setvisible(true);
}
}
class transformframe extends jframe implements actionlistener
{
//添加几个按钮方便操作。
jbutton rote = new jbutton("旋转") ;
jbutton flipx= new jbutton("水平翻转");
jbutton flipy= new jbutton("垂直翻转");
jbutton zoomin = new jbutton("放大") ;
jbutton zoomout = new jbutton("缩小") ;
public transformframe()
{
settitle("transformtest");
setsize(400, 400);
addwindowlistener(new windowadapter()
{
public void windowclosing(windowevent e)
{
system.exit(0);
}
});
container contentpane = getcontentpane();
canvas = new transpanel();
contentpane.add(canvas, "center");
jpanel buttonpanel = new jpanel();
buttonpanel.add(rote);
rote.addactionlistener(this);
buttonpanel.add(flipx);
flipx.addactionlistener(this);
buttonpanel.add(flipy);
flipy.addactionlistener(this);
buttonpanel.add(zoomin) ;
zoomin.addactionlistener(this) ;
buttonpanel.add(zoomout) ;
zoomout.addactionlistener(this) ;
contentpane.add(buttonpanel, "north");
}
public void actionperformed(actionevent event)
{
object source = event.getsource();
//对于source == ???这种方法,在特殊的情况下出现错误,所以,需要酌情使用event.getsource().equals()方法来替代==
if (source == rote)
{
canvas.setrotate();
} else
if (source == flipx)
{
canvas.flipx();
} else
if (source == flipy)
{
canvas.flipy();
} else
if (source == zoomin)
{
canvas.zoomin();
} else
if (source == zoomout)
{
canvas.zoomout();
}
}
private transpanel canvas;
}
class transpanel extends jpanel
{
//水平翻转比例的标志。-1表示需要进行水平翻转
int m_nflipxscale = 1 ;
//垂直翻转比例的标志。-1表示需要进行垂直翻转
int m_nflipyscale = 1 ;
//旋转的角度。因为工程需要,代码中直接写成了90,可以根据具体需要动态修改,以符合实际情况
int roteangle = 0 ;
//缩放比例。默认的比例0表示没有翻转,具体的翻转大小通过一个方法:getzoomsize()获取
int zoomlevel = 0 ;
public transpanel()
{
//首先载入一张图片。
img = new imageicon("d000.gif").getimage();
}
public void paintcomponent(graphics g)
{
super.paintcomponent(g);
g.drawimage(img,0,0,this) ;
drawtransimage(g,img.getwidth(this),img.getheight(this),zoomlevel) ;
}
public void drawtransimage(graphics g,int drawx,int drawy,int zoom)
{
int x = 0 ;
int y = 0 ;
int w = img.getwidth(this) ;
int h = img.getheight(this) ;
int zoomw = getzoomsize(w,zoom) ;
int zoomh = getzoomsize(h,zoom) ;
int xpos = 0 ;
int ypos = 0 ;
if (m_nflipxscale == -1)
xpos = -zoomw ;
if (m_nflipyscale == -1)
ypos = -zoomh ;
graphics2d g2 = (graphics2d)g ;
//转换坐标原点。这步不要也成,但是将当前位置转换为坐标原点后,可以节省好多计算步骤,非常好用。
//不过记得用完了以后,一定要把原点转换回来,要不然其他地方就乱了
g2.translate(drawx,drawy);
if (roteangle != 0)
g2.rotate(math.toradians(m_nflipxscale * m_nflipyscale * roteangle),zoomw >> 1,zoomh >> 1);
//上面的m_nflipxscale * m_nflipyscale需要特殊说明一下:因为实际使用中,可能遇到各种组合的情况,比如
//先flipx或者flipy以后然后再旋转,这时候,图片的旋转方向就会出现错误,加上这段代码可以保证无论使用哪种组合
//操作方式,都保证在旋转图片的时候是按照顺时针的方向进行旋转。
if (m_nflipxscale == -1)
g2.scale(-1,1);//第一个值表示水平,-1表示等宽水平翻转,math.abs(m_nflipxscale)的值越大,出来的图片就越宽
if (m_nflipyscale == -1)
g2.scale(1,-1);//第二个值表示垂直,-1表示等高垂直翻转,math.abs(m_nflipyscale)的值越大,出来的图片就越高
//显示图片
g2.drawimage(img,xpos,ypos,xpos + zoomw,ypos + zoomh,x,y,w,h,null) ;
g2.translate(-drawx,-drawy);
}
public void setrotate()
{
roteangle += 90 ;
roteangle %= 360 ;
repaint();
}
public void flipx()
{
m_nflipxscale = -m_nflipxscale ;
repaint();
}
public void flipy()
{
m_nflipyscale = -m_nflipyscale ;
repaint();
}
public void zoomin()
{
zoomlevel++ ;
repaint();
}
public void zoomout()
{
zoomlevel-- ;
repaint();
}
public static final int getzoomsize(int sourcesize,int zoomlevel)
{
if (zoomlevel == 0)
return sourcesize ;
else
if (zoomlevel < 0)
return sourcesize / (math.abs(zoomlevel) + 1) ;
else
return sourcesize * (zoomlevel + 1) ;
}
private image img;
} 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家。
原文链接:https://blog.csdn.net/wyg_vip/article/details/4109261
|