评论

收藏

[Java] Java实现图片翻转以及任意角度旋转

编程语言 编程语言 发布于:2021-10-05 18:08 | 阅读数:206 | 评论:0

这篇文章主要为大家详细介绍了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

关注下面的标签,发现更多相似文章