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 ...
随机推荐
- Direct3d 设备丢失 (device lost) (转载)
转:http://blog.csdn.net/kuangfengwu/article/details/7674074 1.什么时候设备丢失 一个Direct3D设备, 有两种状态: 操作状态或丢失状态 ...
- dbMigration .NET 数据同步迁移工具
官网:http://fishcodelib.com/DBMigration.htm
- delphi Image 处理
procedure ResizeBmp(Src,Dst:String);var SrcBM,DstBM:TBitMap; Rect:TRect; NewW,NewH,PicW,PicH:Integer ...
- Android项目更换开发环境时出现的 java.lang.VerifyError 异常解决办法
from://http://blog.csdn.net/wudiwo/article/details/7548451 项目是从同事的电脑上直接拷贝过来的,项目里面的jar包是在项目跟下libs里面存放 ...
- poj 3071 Football(概率dp)
id=3071">http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率 ...
- 《王者荣耀》技术总监复盘回炉历程:没跨过这三座大山,就是另一款MOBA霸占市场了
如今已经大获市场成功的<王者荣耀>一直是业内各方关注的对象,而我们也知道这款产品在成为国民级游戏之前,也遇到过一段鲜有人知的调优期.也就是在2015年8月18号正式不删档测试版本推出之后, ...
- 安卓开发(Java)中关于final关键字与线程安全性
前言 学习新知识固然重要,但是时常往回看看,温故知新是很必要的.回顾一下线程安全性和final关键字. 正文 从Java 5开始,final keyword一个特殊用法是在并发库中一个非常重要且经常被 ...
- 5分钟了解Mockito
一.什么是mock测试,什么是mock对象? 先来看看下面这个示例: 从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例. 一种替代方案就是使用mocks 从图 ...
- 白话Spring(基础篇)---AOP(execution表达式)
作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! -------------------------------- ...
- CubieBoard 简单入门
大约一个月之前折腾的部分记录,当时没有完全完成,就着手其他事情了,这是存在Live Writer中的草稿,先发出来吧,后来花了一段时间移植Qt,一直遇到了点问题,并没有完全跑通,后续估计也没有时间再继 ...