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 ...
随机推荐
- Java中的锁(转)
Java中的锁 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂.因为锁(以及其它更高级的线程同步机制)是由synchronized同步 ...
- 百度公共dns
常用公共DNS服务器地址 DNS(Domain Name System),即域名解析系统,作为将域名和IP地址相互映射的一个分布式数据库,能够使人通过相对好记的域名访问网站,而是一串数字.目前国内运营 ...
- UINavigationController 、UINavigationBar 、UINavigationItem 超清晰直观详解(扩展)
ios开发中如何隐藏各种bar 状态条Status Bar [UIApplication sharedApplication].statusBarHidden = YES; 或者 // iOS3.2+ ...
- mac 设置 代理 上网 步骤 同时设置邮件代理
设置mac电脑网络代理步骤如下: 第一步:打开网络偏好设置 第二步:依次输入如下参数 第三步:设置代理服务器地址 设置邮箱使用代理步骤如下: 第一步: 第二步:选择使用“系统代理设置”即可,无需其它多 ...
- bean validation 技术规范
Bean Validation 技术规范特性概述 张 冠楠 和 陈 志娴2011 年 3 月 24 日发布 WeiboGoogle+用电子邮件发送本页面 2 概述 Bean Validation 规范 ...
- 本地docker搭建gitlab, 并配置ldap认证
基于Docker在Mac OS X系统中的部署和设置GitLab的具体过程如下: 1. 安装Docker for Mac (参见https://docs.docker.com/docker-for ...
- 怪奇物语第二季/全集Stranger Things迅雷下载
Netflix的叫好叫座剧<怪奇物语 Stranger Things>第二季更新上线日期为美国时间10月27日,第二季讲述在1984年(相隔上季一年),印第安纳州的Hawkins镇市民仍然 ...
- hydra 安装和使用
udo add-apt-repository ppa:pi-rho/security sudo apt-get update sudo apt-get install hydra hydra -l r ...
- 用GridLayout实现计算器的布局
GridLayout是一个表格视图,我们一般定义它的列数和行数来设置好这个控件. 下面的布局文件先定义了一个TextView和一个Button,设置他们的属性为横跨4列.这样就可以独自占据一行了.然后 ...
- [Web 前端] React Js img 图片显示默认 占位符
cp from : https://blog.csdn.net/wyk304443164/article/details/77093339 没有考虑到兼容性,因为我们暂时只适配了webkit. 也没有 ...