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. ORM for Net主流框架汇总与效率测试

    框架已经被越来越多的人所关注与使用了,今天我们就来研究一下net方面的几个主流ORM框架,以及它们的效率测试(可能会有遗漏欢迎大家讨论). ORM框架:Object/Relation Mapping( ...

  2. [Go] md5 加密 示例

    package main import ( "crypto/md5" "encoding/hex" "fmt" "io" ...

  3. linux 内核开发环境搭建

    http://blog.csdn.net/jemmy858585/article/details/46710299

  4. 怎么发现RAC环境中&#39;library cache pin&#39;等待事件的堵塞者(Blocker)?

    怎么发现RAC环境中的'library cache pin'等待事件的堵塞者(Blocker) 參考自 How to Find the Blocker of the 'library cache pi ...

  5. [Android 动画]简要分析一下Animator 与 Animation

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 在 A ...

  6. Revit Family API 创建参考平面

    使用API来编辑族时,使用doc.FamilyCreate.NewReferencePlane();创建参考平面. )         {  ];         }         // canno ...

  7. 对一个前端AngularJS,后端OData,ASP.NET Web API案例的理解

    依然chsakell,他写了一篇前端AngularJS,后端OData,ASP.NET Web API的Demo,关于OData在ASP.NET Web API中的正删改查没有什么特别之处,但在前端调 ...

  8. DIOCP数据包太大,请在业务层分拆发送

    DIOCP数据包太大,请在业务层分拆发送 DIOCP日志记录异常:数据包太大,请在业务层分拆发送...... 跟踪发现,原因在下图:

  9. 安装oracle 11g环境变量ORACLE_HOME的一个问题 转

    http://blog.itpub.net/26129555/viewspace-1243467/报错内容: OUI-10137:An Oracle Home with name ORACLE_HOM ...

  10. 【Devops】【docker】【CI/CD】jenkins 清除工作空间报错Error: Wipe Out Workspace blocked by SCM

    jenkins 清除工作空间报错 错误如下: Error: Wipe Out Workspace blocked by SCM 解决方法: 进入jenkins服务器,进入workspace,手动rm ...