java 旋转图片_Java实现图片翻转以及任意角度旋转

最近几天在做一个项目,因为涉及到了图片(绝大部分都不是整图,是把一张张的大图切成小图,也就是Title)的翻转以及90°旋转,弄得焦头烂额。在网上搜索好几天,发现用到的方法都是比较公式化的,对于只是在绘图的时候需要显示翻转而不需要另外生成图片的情况,这些代码用起来非常的麻烦。最后仔细的研究了一下JDK文档,用Graphics2D很简单的就实现了以下功能:

1、图片的翻转,包括水平翻转以及垂直翻转

2、图片的任意角度旋转。因为工程需要,代码里面都直接写成了+90,根据需要,可以对这个值进行改动,以符合需求。

3、可以使用组合操作,比如水平翻转+旋转,或者垂直+水平+旋转,任意。

以下是代码:

package Demo628;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

public class ImageRote

{

public static void main(String[] args)

{

JFrame frame = new TransformFrame();

frame.setVisible(true);

}

}

class TransformFrame extends JFrame implements ActionListener

{

//添加几个按钮方便操作。

JButton rote = new JButton("旋转") ;

JButton flipX= new JButton("水平翻转");

JButton flipY= new JButton("垂直翻转");

JButton zoomIn = new JButton("放大") ;

JButton zoomOut = new JButton("缩小") ;

public TransformFrame()

{

setTitle("TransformTest");

setSize(400, 400);

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

});

Container contentPane = getContentPane();

canvas = new TransPanel();

contentPane.add(canvas, "Center");

JPanel buttonPanel = new JPanel();

buttonPanel.add(rote);

rote.addActionListener(this);

buttonPanel.add(flipX);

flipX.addActionListener(this);

buttonPanel.add(flipY);

flipY.addActionListener(this);

buttonPanel.add(zoomIn) ;

zoomIn.addActionListener(this) ;

buttonPanel.add(zoomOut) ;

zoomOut.addActionListener(this) ;

contentPane.add(buttonPanel, "North");

}

public void actionPerformed(ActionEvent event)

{

Object source = event.getSource();

//对于source == ???这种方法,在特殊的情况下出现错误,所以,需要酌情使用event.getSource().equals()方法来替代==

if (source == rote)

{

canvas.setRotate();

} else

if (source == flipX)

{

canvas.flipX();

} else

if (source == flipY)

{

canvas.flipY();

} else

if (source == zoomIn)

{

canvas.zoomIn();

} else

if (source == zoomOut)

{

canvas.zoomOut();

}

}

private TransPanel canvas;

}

class TransPanel extends JPanel

{

//水平翻转比例的标志。-1表示需要进行水平翻转

int m_nFlipXScale = 1 ;

//垂直翻转比例的标志。-1表示需要进行垂直翻转

int m_nFlipYScale = 1 ;

//旋转的角度。因为工程需要,代码中直接写成了90,可以根据具体需要动态修改,以符合实际情况

int roteAngle = 0 ;

//缩放比例。默认的比例0表示没有翻转,具体的翻转大小通过一个方法:getZoomSize()获取

int zoomLevel = 0 ;

public TransPanel()

{

//首先载入一张图片。

img = new ImageIcon("D000.GIF").getImage();

}

public void paintComponent(Graphics g)

{

super.paintComponent(g);

g.drawImage(img,0,0,this) ;

drawTransImage(g,img.getWidth(this),img.getHeight(this),zoomLevel) ;

}

public void drawTransImage(Graphics g,int drawx,int drawy,int zoom)

{

int x = 0 ;

int y = 0 ;

int w = img.getWidth(this) ;

int h = img.getHeight(this) ;

int zoomw = getZoomSize(w,zoom) ;

int zoomh = getZoomSize(h,zoom) ;

int xPos = 0 ;

int yPos = 0 ;

if (m_nFlipXScale == -1)

xPos = -zoomw ;

if (m_nFlipYScale == -1)

yPos = -zoomh ;

Graphics2D g2 = (Graphics2D)g ;

//转换坐标原点。这步不要也成,但是将当前位置转换为坐标原点后,可以节省好多计算步骤,非常好用。

//不过记得用完了以后,一定要把原点转换回来,要不然其他地方就乱了

g2.translate(drawx,drawy);

if (roteAngle != 0)

g2.rotate(Math.toRadians(m_nFlipXScale * m_nFlipYScale * roteAngle),zoomw >> 1,zoomh >> 1);

//上面的m_nFlipXScale * m_nFlipYScale需要特殊说明一下:因为实际使用中,可能遇到各种组合的情况,比如

//先flipX或者flipY以后然后再旋转,这时候,图片的旋转方向就会出现错误,加上这段代码可以保证无论使用哪种组合

//操作方式,都保证在旋转图片的时候是按照顺时针的方向进行旋转。

if (m_nFlipXScale == -1)

g2.scale(-1,1);//第一个值表示水平,-1表示等宽水平翻转,Math.abs(m_nFlipXScale)的值越大,出来的图片就越宽

if (m_nFlipYScale == -1)

g2.scale(1,-1);//第二个值表示垂直,-1表示等高垂直翻转,Math.abs(m_nFlipYScale)的值越大,出来的图片就越高

//显示图片

g2.drawImage(img,xPos,yPos,xPos + zoomw,yPos + zoomh,x,y,w,h,null) ;

g2.translate(-drawx,-drawy);

}

public void setRotate()

{

roteAngle += 90 ;

roteAngle %= 360 ;

repaint();

}

public void flipX()

{

m_nFlipXScale = -m_nFlipXScale ;

repaint();

}

public void flipY()

{

m_nFlipYScale = -m_nFlipYScale ;

repaint();

}

public void zoomIn()

{

zoomLevel++ ;

repaint();

}

public void zoomOut()

{

zoomLevel-- ;

repaint();

}

public static final int getZoomSize(int sourceSize,int zoomLevel)

{

if (zoomLevel == 0)

return sourceSize ;

else

if (zoomLevel < 0)

return sourceSize / (Math.abs(zoomLevel) + 1) ;

else

return sourceSize * (zoomLevel + 1) ;

}

private Image img;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java核心api_Java核心API需要掌握的程度..你做到了多少??

评论19 楼lovelh2010-09-10编程思想啊。。。。。。18 楼xiang.beyond2010-09-08A_Jane 写道把API烂熟于心又如何&#xff1f;难道一辈子去做程序员&#xff1f;关键需要掌握的还是处理事情的方法。API可以去查&#xff0c;编程的思想怎么去查&#xff1f;说得好 但话说回来这些…

java 排序api_用java api进行sort

Sun授权刊登本节中所描述的多态算法 (polymorphic algorithms)是由 JDK 所提供的可重复使用的功能性片段。它们均取自Collections类&#xff0c;并都采用静态方法(它的第一个参数是执行操作的 对象集)的形式。由Java平台所提供的绝大多数算法都操作于List对象&#xff0c;但有两…

java判断正整数正则_Java正则验证正整数的方法分析【测试可用】

本文实例讲述了Java正则验证正整数的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;package des;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Num {/*** param args*/public static void main(String[] args) {// TODO Auto-ge…

java上溯造型_think-in-java/6.7 上溯造型.md at master · quanke/think-in-java · GitHub

6.7 上溯造型继承最值得注意的地方就是它没有为新类提供方法。继承是对新类和基础类之间的关系的一种表达。可这样总结该关系&#xff1a;“新类属于现有类的一种类型”。这种表达并不仅仅是对继承的一种形象化解释&#xff0c;继承是直接由语言提供支持的。作为一个例子&#…

java 官网下载jdk源码_openJDK之如何下载各个版本的openJDK源码

如果我们需要阅读openJDK的源码&#xff0c;那么需要下载&#xff0c;那么该去哪下载呢?现在JDK已经发展到版本10了&#xff0c;11已经处于计划中&#xff0c;如果需要特定版本的openJDK&#xff0c;它们的下载链接在哪呢?1.openJDK的项目图1 可以看到有openJDK6、openJDK7、…

java 这么获取农历_用JAVA查询中国农历年

用来查询农历年的代码&#xff0c;可能比较粗糙&#xff0c;希望不要太打击偶&#xff0c;哈哈。一&#xff0c;Console.java[用来获取控制台的输入]/*#()Console.java 20:40:25 2/2/2006控制台消息输入/输出。*/import java.io.*;import java.text.SimpleDateFormat;import ja…

java 最大分词算法_Java实现的最大匹配分词算法详解

本文实例讲述了java实现的最大匹配分词算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;全文检索有两个重要的过程&#xff1a;1分词2倒排索引我们先看分词算法目前对中文分词有两个方向&#xff0c;其中一个是利用概率的思想对文章分词。 也就是如果两个字&#x…

java 集合迭代器_Java中的集合迭代器

集合的迭代器任何集合都有迭代器。任何集合类&#xff0c;都必须能以某种方式存取元素&#xff0c;否则这个集合容器就没有任何意义。迭代器&#xff0c;也是一种模式(也叫迭代器模式)。在java中它是一个对象&#xff0c;其目的是遍历并选中其中的每个元素&#xff0c;而使用者…

git关闭密码自动存储_项目在 git 里怎样合理的保存配置文件(服务器密码等敏感内容)...

办法其实很多&#xff0c;有两种较常用。第一种是配置文件不提交真实内容&#xff0c;只提交一个模板文件。每个开发者克隆之后按照自己的环境补完配置文件&#xff0c;这样自然而然就独立出来了(需更改文件名并忽略有效配置文件)。如果配置文件很大配置项很多&#xff0c;此法…

isfull mysql_Mysql8.0及以上版本,关于only_full_group_by的问题

mysql8.0及以上版本&#xff0c;关于only_full_group_by的问题&#xff1a;ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column postscan.verifyDelayLog.auditor which is not functionally dependent on column…

java jnotify_Jnotify文件监控的用法以及Jar文件导入的方法

简介Jnotiy, 支持动态监控(支持级联监控)文件夹和文件的jar包。在linux中&#xff0c;调用linux底层的jnotify服务。在windows中&#xff0c;需要添加附件的dll文件。因为通用的Maven仓库中没有此Jar文件&#xff0c;pom.xml文件需要如下配置&#xff1a;net.contentobjects.jn…

java 异常练习题_Java 异常(习题)

异常Key Point* 异常的概念和分类* 异常的产生和传递* 异常的处理* 自定义异常练习1. 填空Java 中所有的错误都继承自throwable类&#xff1b;在该类的子类中&#xff0c;Error类表示严重的底层错误&#xff0c;对于这类错误一般处理的方式是不要求我们对其处理Exception类表示…

mysql 半同步 主主_MySQL主从,半同步,主主复制

MySQL Replication我们知道&#xff0c;MySQL数据库的二进制日志记录着每一个明确或者潜在可能导致数据库发生改变的sql语句&#xff0c;因此我们可以基于二进制日志来实现mysql的主从一致。而我们在此提到的mysql的复制的简单过程就是&#xff1a;首先mysql的主服务器(Master)…

java local_java.time.LocalDateTime with()方法

java.time.LocalDateTime with()方法java.time.LocalDateTime.with(TemporalAdjuster adjuster)方法返回此日期时间的调整副本。1 语法public LocalDateTime with(TemporalAdjuster adjuster)2 参数adjuster&#xff1a;要使用的调整器&#xff0c;而不是null。3 返回值一个Loc…

java 数据队列_Java 数据结构 - 队列

Java 数据结构 - 队列我们今天要讲的数据结构是队列&#xff0c;比如 Java 线程池任务就是队列实现的。1. 什么是队列和栈一样&#xff0c;队列也是一种操作受限的线性结构。使用队列时&#xff0c;在一端插入元素&#xff0c;而在另一端删除元素。1.1 队列的主要特性队列中的数…

java中死锁_关于java中死锁的总结

关于死锁&#xff0c;估计很多程序员都碰到过&#xff0c;并且有时候这种情况出现之后的问题也不是非常好排查&#xff0c;下面整理的就是自己对死锁的认识&#xff0c;以及通过一个简单的例子来来接死锁的发生&#xff0c;自己是做python开发的&#xff0c;但是对于死锁的理解…

eclipse java的jvm匹配_eclipse设置jvm

Java虚拟机默认分配64M内存&#xff0c;如果你的应用比较大&#xff0c;超出64M内存&#xff0c;Java虚拟机就会抛出outOfMemoryError&#xff0c;并停止运行。不管是什么应用(Web应用、Application等)&#xff0c;只需要修改你的机器上的运行Java命令&#xff0c;在javaxxx命令…

java+set+split_阿里资深工程师教你如何优化 Java 代码!

原标题&#xff1a;阿里资深工程师教你如何优化 Java 代码&#xff01;作者 | 王超责编 | 伍杏玲明代王阳明先生在《传习录》谈为学之道时说&#xff1a;私欲日生&#xff0c;如地上尘&#xff0c;一日不扫&#xff0c;便又有一层。着实用功&#xff0c;便见道无终穷&#xff0…

java返回特定下标元素_java基础--输出数组中指定元素的下标

java基础--输出数组中指定元素的下标java基础--输出数组中指定元素的下标package com.lcn.day05;public class ArrayDemo8 {/*** 输出数组指定元素的下标*/public static void main(String[] args) {//定义一个数组int[] array new int[]{123,456,789,321,654,987};int index …

java钱币换算_Java编写钱币转换为大写程序

import java.text.DecimalFormat;public class ChangeMonney {private static final String[] STR_UNIT {"零", "壹", "贰", "叁", "肆", "伍","陆", "柒", "捌", "玖"…