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();
}
}
/*
JAVA对图片的任意角度旋转,以及镜像操作的更多相关文章
- Java实现图片内容无损任意角度旋转
转自:http://blog.csdn.net/heliang7/article/details/7309394 主要问题是如何在图片做旋转后计算出新图片的长宽. 在java 2d和基本math库的帮 ...
- 在word中输入任意角度旋转图片
Sub 图片旋转任意角度() Dim sha As Shape, isa As InlineShape Static s As Integer Application.ScreenUpdating = ...
- java处理图片--图片的缩放,旋转和马赛克化
这是我自己结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化.(转载请注明出处:http://blog.csdn.net/u012116457) 不多说,上代码: packag ...
- Winform以任意角度旋转PictureBox中的图片的方法
方法1: private void RotateFormCenter(PictureBox pb, float angle) { Image img = pb.Image; int newWidth ...
- C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字
这篇文章是 GDI+ 总结系列的第三篇,如果对 GDI+ 的基础使用不熟悉的朋友可以先看第一篇文章<C# 使用 GDI+ 画图>. 需求 需求是要实现给图片添加任意角度旋转的文字,文字的旋 ...
- 在图片不被裁剪时opencv绕图片中任意点旋转任意角度
opencv绕图片中任意角度旋转任意角度 最近在做项目需要把把图片绕图片中任意点旋转任意角度,考虑到自己旋转需要编写插值算法,所以想到了用opencv,但是网上都是围绕图片中点旋转任意角度的,都是 ...
- JQuery插件让图片旋转任意角度且代码极其简单
引入下方的jquery.rotate.js文件,然后通过$("选择器").rotate(角度);可以旋转任意角度, 例如$("#rotate-image").r ...
- JQuery插件让图片旋转任意角度且代码极其简单 - 摘自网友
JQuery插件让图片旋转任意角度且代码极其简单 2012-04-01 09:57:03 我来说两句 收藏 我要投稿 引入下方的jquery.rotate.js文件,然后通过$ ...
- java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...
随机推荐
- 用ViewPager实现一个程序引导界面
下面使用ViewPager来实现一个程序引导的demo: 一般来说,引导界面是出现第一次运行时出现的,之后不会再出现.所以需要记录是否是第一次使用程序,办法有很多,最容易想到的就是使用SharedPr ...
- USB设备的插入和弹出的监听以及软弹出可移动媒体(如Windows的移除USB设备) .
一.监听USB设备的插入和弹出 当USB设备插入或者弹出时,Windows会产生一条全局消息:WM_DEVICECHANGE 我们需要做的是,获得这条消息的wParam参数,如果为DBT_DEVICE ...
- CentOS 6.8 安装最新版 Git
CentOS 6.8 自带的 Git 版本为 1.7.1,比较旧,yum 安装也停留在 1.7.1,还是源码编译安装吧. 1. 下载源码: wget -c https://github.com/git ...
- Plan Explorer数据库
Plan Explorer数据库 https://www.sentryone.com/platform/sql-server-performance-monitoring
- delphiredisclient开源GIT
delphiredisclient - Redis client for Delphi Delphi Redis Client版本2(此分支)与Delphi 10.1 Berlin兼容,更好.警告!如 ...
- arcengine Annotation研究的一些学习资料(转)FeatureWeight
转自chanyinhelv原文Annotation研究的一些学习资料 下面是我最近对Annotation研究的一些学习资料,收集于此,供大家学习之用. 一.Annotation要素类介绍 在GeoDa ...
- 【CentOS】centos7上查看服务开机启动列表
centos7上查看服务开机启动列表 命令: systemctl list-unit-files; 点击回车,可以向下翻页查询
- 基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
在ipad.iphone网页开发中,我们很可能需要判断是横屏或者竖屏.下面就来介绍如何用 jQuery 判断iPad.iPhone.Android是横屏还是竖屏的方法 其实主要是通过window.or ...
- 使用Camera进行拍照 & 后台静默拍照的思路
Android中的Camera可以用来进行自定义相机.取景框实时预览.拍照等操作.在5.0中,这个类不推荐使用了,新出了一个Camera2,那个东西没怎么研究过,反正一时半会用不到.本篇讲解的是如果用 ...
- vue elementui switch开关控件的使用
<el-switch @change="test" on-value="1" off-value="0" v-model=" ...