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();
 }

}
/*

JAVA对图片的任意角度旋转,以及镜像操作的更多相关文章

  1. Java实现图片内容无损任意角度旋转

    转自:http://blog.csdn.net/heliang7/article/details/7309394 主要问题是如何在图片做旋转后计算出新图片的长宽. 在java 2d和基本math库的帮 ...

  2. 在word中输入任意角度旋转图片

    Sub 图片旋转任意角度() Dim sha As Shape, isa As InlineShape Static s As Integer Application.ScreenUpdating = ...

  3. java处理图片--图片的缩放,旋转和马赛克化

    这是我自己结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化.(转载请注明出处:http://blog.csdn.net/u012116457) 不多说,上代码: packag ...

  4. Winform以任意角度旋转PictureBox中的图片的方法

    方法1: private void RotateFormCenter(PictureBox pb, float angle) { Image img = pb.Image; int newWidth ...

  5. C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字

    这篇文章是 GDI+ 总结系列的第三篇,如果对 GDI+ 的基础使用不熟悉的朋友可以先看第一篇文章<C# 使用 GDI+ 画图>. 需求 需求是要实现给图片添加任意角度旋转的文字,文字的旋 ...

  6. 在图片不被裁剪时opencv绕图片中任意点旋转任意角度

    opencv绕图片中任意角度旋转任意角度   最近在做项目需要把把图片绕图片中任意点旋转任意角度,考虑到自己旋转需要编写插值算法,所以想到了用opencv,但是网上都是围绕图片中点旋转任意角度的,都是 ...

  7. JQuery插件让图片旋转任意角度且代码极其简单

    引入下方的jquery.rotate.js文件,然后通过$("选择器").rotate(角度);可以旋转任意角度, 例如$("#rotate-image").r ...

  8. JQuery插件让图片旋转任意角度且代码极其简单 - 摘自网友

    JQuery插件让图片旋转任意角度且代码极其简单 2012-04-01 09:57:03     我来说两句      收藏    我要投稿 引入下方的jquery.rotate.js文件,然后通过$ ...

  9. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

随机推荐

  1. 设计模式之七:模板方法模式(Template Method)

    模板方法模式: 定义了一个算法的基本操作骨架,并将算法的一些步骤延迟到子类中来实现. 模板方法模式让子类在不更改算法结构的前提下能够又一次定义算法的一些步骤. Define the skeleton ...

  2. STM32 Seminar 2007 -- Timer

  3. Linux Delay Accounting

    https://andrestc.com/post/linux-delay-accounting/ Ever wondered how long is your program spending wh ...

  4. JavaScript 扩展运算符

    扩展运算符格式扩展运算符格式很简单,就是三个点(...) 扩展运算符作用???扩展运算符允许一个表达式在期望多个参数(用于函数调用)或多个元素(用于数组字面量)或多个变量(用于解构赋值)的位置扩展. ...

  5. .Net Discovery 系列之七--深入理解.Net垃圾收集机制(拾贝篇)

    关于.Net垃圾收集器(Garbage Collection),Aicken已经在“.Net Discovery 系列”文章中有2篇的涉及,这一篇文章是对上2篇文章的补充,关于“.Net Discov ...

  6. 在ASP.NET Web API中使用OData的Action和Function

    本篇体验OData的Action和Function功能.上下文信息参考"ASP.NET Web API基于OData的增删改查,以及处理实体间关系".在本文之前,我存在的疑惑包括: ...

  7. ios 判断app程序第一次启动方法

    if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firstStart"]){ [[NSUserDefaults st ...

  8. git 删除远程分支和本地分支

    删除远程分支和本地分支 https://www.cnblogs.com/luosongchao/p/3408365.html 将远程git仓库里的指定分支拉取到本地(本地不存在的分支) https:/ ...

  9. 不规则形状的Mask动画

    不规则形状的Mask动画 效果 源码 https://github.com/YouXianMing/Animations // // MaskShapeViewController.m // Anim ...

  10. 亿万第一至二季/全集Billions迅雷下载

    英文全名Billions,第1季(2016)Showtime. 本季看点:<亿万>讲述了纽约市政治与经济领域.关于金钱的一场较量.故事主要描述两个华尔街重量级人物之间的战争.精明.强硬的检 ...