JAVA對圖片的任意角度旋轉,以及鏡像操作


package relevantTest;
/*
 * 該代碼實現了對圖像的水平鏡像變換,垂直鏡像變換,任意角度旋轉,jtf的實時監控,以及對圖像的縮放變換,以及按鈕的若隱若現效果。
 * 在對圖像進行任意角度旋轉時最好是在原始圖片未進行任何操作時進行,否則由於坐標的改變,圖像可能顯示在了屏幕之外
 * 請使用鼠標右鍵彈出菜單進行功能的實現
 */
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;

public class ImgsOperation {
 protected static final int ICONIFIED = 1;
 static Image img=(new ImageIcon("images/王梓盈.jpg")).getImage(); 
 static Image  close=(new ImageIcon("images/close00.png")).getImage();
 static Image  turn=(new ImageIcon("images/turn.png")).getImage();
 static Image min=(new ImageIcon("images/min00.jpg")).getImage();
 static int  imgWidth=img.getWidth(null);
 static int imgHeight=img.getHeight(null);
 static int ScreenWidth=Toolkit.getDefaultToolkit().getScreenSize().width;
 static int ScreenHeight=Toolkit.getDefaultToolkit().getScreenSize().height;
 static int xCoor=(ScreenWidth-imgWidth)/2;
 static int yCoor=(ScreenHeight-imgHeight)/2;
 static int xCoor0=0,yCoor0=0;
 static int count=1;//記錄點擊的次數
 static int count0=1;
 String Str="";
 String Str0;
static double degree=0;//旋轉的角度,都是順時針旋轉
static int xCoor1=ScreenWidth/2,yCoor1=ScreenHeight/2;//旋轉中心坐標值
 public ImgsOperation(){
  final JFrame frame=new JFrame();
 final Pics0Panel jp=new Pics0Panel();//顯示圖片的面板
  jp.setBackground(new Color(51,51,51));
  jp.setLayout(new FlowLayout(FlowLayout.RIGHT,0,0));
 final JPanel jp0=new JPanel();
  jp0.setPreferredSize(new Dimension(65,20));
  jp0.setBackground(new Color(51,51,51));
  jp0.setLayout(new FlowLayout(FlowLayout.RIGHT,1,0));
 final ClosePanel cjp=new ClosePanel();
  cjp.setPreferredSize(new Dimension(36,18));
  cjp.setVisible(false);
 final MinPanel mjp=new MinPanel();
  mjp.setPreferredSize(new Dimension(27,18));
  mjp.setVisible(false);
  JPopupMenu jpm=new JPopupMenu();
  JMenuItem turn0=new JMenuItem("水平鏡像變換");
  JMenuItem turn1=new JMenuItem("垂直鏡像變換");
  //JMenuItem turn2=new JMenuItem("中心對稱變換");
  JMenuItem turn=new JMenuItem("自定義角度旋轉");
 final JTextField jtf=new JTextField(3);
  jtf.setPreferredSize(new Dimension(30,21));
  TurnPanel tjp=new TurnPanel();
  tjp.setPreferredSize(new Dimension(112,21));
  tjp.setBackground(new Color(213,233,255));
  tjp.setLayout(new FlowLayout(FlowLayout.RIGHT,0,0));
  tjp.add(jtf);  
  turn0.setForeground(new Color(204,204,204));
  turn1.setForeground(new Color(204,204,204)); 
  turn.setForeground(new Color(204,204,204));
  turn0.setBackground(new Color(51,51,51));
  turn1.setBackground(new Color(51,51,51)); 
  turn.setBackground(new Color(51,51,51));
  jpm.setBackground(new Color(51,51,51));
  jpm.add(turn0);
  jpm.add(turn1); 
  jpm.addSeparator();
  jpm.add(turn);
  jpm.add(tjp);
  jp.setComponentPopupMenu(jpm);
  jp0.add(mjp);
  jp0.add(cjp);
  jp.add(jp0);
  frame.add(jp);
  frame.setUndecorated(true);
  frame.setSize(ScreenWidth,ScreenHeight);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
 //若隱若現,控制按鈕的顯示方式
  jp0.addMouseListener(new MouseAdapter(){
   public void mouseEntered(MouseEvent e){    
    cjp.setVisible(true);
    mjp.setVisible(true);
   }
   public void mouseExited(MouseEvent e){
    cjp.setVisible(false);
    mjp.setVisible(false);
   }
  });
  //關閉窗口代碼
  cjp.addMouseListener(new MouseAdapter(){
   public void mouseClicked(MouseEvent e){
    System.exit(0);
   }
   public void mouseEntered(MouseEvent e){
    cjp.setVisible(true);
    mjp.setVisible(true);
   }
   public void mouseExited(MouseEvent e){
    cjp.setVisible(false);
    mjp.setVisible(false);
   }
  });
  //最小化窗口代碼
  mjp.addMouseListener(new MouseAdapter(){
   public void mouseClicked(MouseEvent e){
    frame.setExtendedState(ICONIFIED);
   }
   public void mouseEntered(MouseEvent e){
    mjp.setVisible(true); 
    cjp.setVisible(true);
   }
   public void mouseExited(MouseEvent e){
    mjp.setVisible(false);
    cjp.setVisible(false);
   }
  });
 //水平翻轉代碼
  turn0.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
        count+=1; 
        if(count%2==0){
     xCoor0=img.getWidth(null);
     imgWidth*=-1;
     jp.repaint();
     }
        else{
         xCoor0=0;
         imgWidth=img.getWidth(null);
         jp.repaint();
        }
    
    
   }
  });
  //垂直翻轉代碼
  turn1.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
    count0+=1;
    if(count0%2==0){    
     yCoor0=img.getHeight(null);
     imgHeight*=-1;
     jp.repaint();
     }else{
      yCoor0=0;
      imgHeight=img.getHeight(null);
      jp.repaint();
     }
    
   }
  });
  //自定義角度旋轉,jtf的監聽代碼,如何實現數據一輸入,就產生相關變化,對jtf的內容變化進行監聽,達到實時監控的效果
  jtf.addCaretListener(new CaretListener(){   
   public void caretUpdate(CaretEvent arg0) {
    Str=jtf.getText();
    if(Str==""||Str.length()==0){
     degree=0;
     jp.repaint();     
    }else{
     degree=(Double.parseDouble(Str))/180.0*3.1415926;
     jp.repaint();
    }    
   }
   
  });
  
 }
 //縮放效果的代碼,使用Java2D的Graphics2D的g.scale(m,n)進行縮放,如果寬=m*原始寬度,高=原始高度*n,大於0放大,小於0,縮小
 static class Pics0Panel extends JPanel{  
  private static final long serialVersionUID = 1L;
  protected void paintComponent(Graphics g){
   super.paintComponent(g);
   Graphics2D g0=(Graphics2D)g;
   g0.translate(xCoor0,yCoor0);//平移,xCoor0>0則向正方向平移xCoor0個單位,同理yCoor0>0,則向y軸正方向平移yCoor0個單位
   g0.rotate(degree,xCoor1,yCoor1);//以坐標xCoor1,yCoor1為中心順時針旋轉degree弧度
   g0.drawImage(img,xCoor,yCoor,imgWidth,imgHeight,this);
   
  }
 }
 //關閉按鈕面板
 static class ClosePanel extends JPanel{  
  private static final long serialVersionUID = 1L;
  protected void paintComponent(Graphics g){
   super.paintComponent(g);   
   g.drawImage(close,0,0,36,18,this);
  }
 }
 
 //最小化按鈕面板
 static class MinPanel extends JPanel{  
  private static final long serialVersionUID = 1L;
  protected void paintComponent(Graphics g){
   super.paintComponent(g);
   g.drawImage(min,0,0,27,18,this);
  }
 }
 //輸入旋轉角度面板
 static class TurnPanel extends JPanel{  
  private static final long serialVersionUID = 1L;
  protected void paintComponent(Graphics g){
   super.paintComponent(g);
   g.drawImage(turn,0,0,26,21,this);
   g.drawString("旋轉角度",30,15);
  }
 }
 public static void main(String[] args){
  new ImgsOperation();
 }

}
/*


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM