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 ...
随机推荐
- HDU 4745 Two Rabbits (2013杭州网络赛1008,最长回文子串)
Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- lua中的pairs和ipairs差别
pairs Returns three values: the next function, the table t, and nil, so that the construction for k, ...
- STM32 USART 波特率计算
The baud rate for the receiver and transmitter (Rx and Tx) are both set to the same value as program ...
- Git 修复 bug 切换分支时,如何保存修改过的代码(即如何保存现场)?
工作除了开发最新的版本之外还要对原来的版本做例行的维护,修修补补.于是有了在两个分支之间游走切换的问题,最新改版的代码在分支 new 上,旧版本的代码在分支 old 上,我在 new 上开发了一半,忽 ...
- [C# 基础知识系列]专题八: 深入理解泛型(二)
引言: 本专题主要是承接上一个专题要继续介绍泛型的其他内容,这里就不多说了,就直接进入本专题的内容的. 一.类型推断 在我们写泛型代码的时候经常有大量的"<"和"& ...
- finger-guessing game:3增加猜拳次数及猜拳按钮显示
增加猜拳次数及猜拳按钮 //初始化引擎组件 init(50, "div_caiquan", 800, 400, main); //定义游戏层,加载进度层.游戏背景层,结果显示层,出 ...
- Visual Studio 2013 sqlce 配置(转)
Visual Studio 2013 把內建 SQL CE 的管理工具拿掉了 下载SQL Server Compact Toolbox by ErikEJ并安装 打开VS2013,新建一工程,在“视图 ...
- myeclipse 2014 专业版 安装 svn插件
团队合作的项目肯定少不了版本控制,那么现在就看看myeclispe中是如何使用的吧. 开发环境:myeclipse 2014 java 8 tomcate 8 试了网上说的几种方法,都没有成功,最 ...
- c++中 extern
用例子给你示范 // 1.cpp int x = 10; // 2.cpp 注意没有包含1.cpp #include <iostream> using namespace std; ext ...
- Android 关于“NetworkOnMainThreadException”出错提示的原因及解决办法
几乎每天都在论坛里面看到有网友问这个问题,代码是无误的,在低版本的API上都可以运行的,但在3.0以上的版本就会出现NetworkOnMainThreadException 出现android.os. ...