最近几天在做一个项目,因为涉及到了图片(绝大部分都不是整图,是把一张张的大图切成小图,也就是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;

}

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

java 旋转图片_Java实现图片翻转以及任意角度旋转相关推荐

  1. java如何利用rotate旋转图片_Java实现图片翻转以及任意角度旋转

    最近几天在做一个项目,因为涉及到了图片(绝大部分都不是整图,是把一张张的大图切成小图,也就是Title)的翻转以及90°旋转,弄得焦头烂额.在网上搜索好几天,发现用到的方法都是比较公式化的,对于只是在 ...

  2. java如何利用rotate旋转图片_JAVA对图片的任意角度旋转,以及镜像操作

    package relevantTest; /* * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果. * 在对图像进行任 ...

  3. JAVA对图片的任意角度旋转,以及镜像操作

    package relevantTest; /*  * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果.  * 在对图像进 ...

  4. 任意角度旋转图片的ground truth目标检测框

    任意角度旋转图片的ground truth目标检测框 (感谢前辈)转自:https://zhuanlan.zhihu.com/p/72129125 因为检测一个物体的时候需要对目标进行多个任意角度的旋 ...

  5. java 图片旋转_Java实现图片内容无损任意角度旋转

    主要问题是如何在图片做旋转后计算出新图片的长宽. 在java 2d和基本math库的帮助下,其实利用简单的计算就可以知道. 以下算法只是计算出旋转小于90度时的公式.当旋转大于90时,可以先把问题域换 ...

  6. java thumbnails 内存_Java修改图片尺寸,总是报内存溢出怎么解决?

    项目需求:有很多尺寸很大的图片(图片大小可能几十MB,甚至上百MB),需要等比例缩小它们的尺寸,相当于生成缩略图. 例如:原图8268x6201,需要压缩成400x300. 我现在的方法:将图片整个读 ...

  7. java中怎么合成图片_Java 实现图片合成

    图片合成 利用Java的绘图方法,实现图片合成 在开始之前,先定一个小目标,我们希望通过图片合成的方式,创建一个类似下面样式的图片 I. 设计思路 首先解析一下我们的目标实现图片合成,那么这些合成的基 ...

  8. java image 透明_Java实现图片透明效果

    Java实现图片透明效果,从演示截图可看到,上层图片与下层图片互相重叠,也就是上层图片透明了,看到了下层以的图片,具体的代码实现: public class HalfTransparentImageD ...

  9. Flex3.0 图片浏览器(平移、光标中心点放缩、任意角度旋转)

    import flash.events.Event;import flash.events.MouseEvent;import flash.geom.Matrix;import flash.geom. ...

最新文章

  1. 脑科学与脑电基础知识汇总
  2. adb shell root
  3. c++中new和delete的使用方法
  4. mybatis-spring 项目简介
  5. 服务器apache远程命令,Linux实例:用socket通讯远程执行命令
  6. springboot使用curator来实现leader选举
  7. 手机4g模块坏了怎么办_古交联通突然断网,手机没信号,不能接打电话该怎么办?...
  8. 深度学习之激活函数篇(Sigmoid、tanh、ReLU、PReLU)
  9. 关于iconfont的一些东西
  10. 人工智能与深度学习概念(3)——目标分类-CNN
  11. Redraiment猜想----米勒拉宾+分块打表
  12. gradle 配置及设置本地仓库
  13. 转 matlab卷积函数介绍 conv filter conv2
  14. cadence学习笔记(2)-PCB封装库制作
  15. # iOS项目——IM聊天工具(集成融云SDK)
  16. 论文解读 Receptive Field Block Net for Accurate and Fast Object Detection
  17. 《汇编语言程序设计》(双语)上机指导
  18. 【学习笔记】sed 命令及参数详解
  19. Linux·信号量全解
  20. Java在编译到执行过程的编码问题

热门文章

  1. 5分钟了解阿里时序时空数据库
  2. 完爆 Best Fit,看阿里如何优化 Sigma 在线调度策略节约亿级成本
  3. PTS + ARMS打造性能和应用诊断利器
  4. 云云协同解决方案全景图发布 华为云助力科技企业云上创新
  5. 阿里云推出“磐久”云原生服务器系列 能效和交付效率大幅提升
  6. 计算机毕设最快多长时间,大学几年快结束了,计算机毕设到底该怎么做?
  7. python代码300行程序_python小工具,15行代码秒出工资条
  8. python字符串转化为数字-python 中判断字符串能否转换为数字类型
  9. 安装oracle需要多少内存,针对大型内存配置的 Oracle VM 安装需要更多步骤 (7195262)...
  10. 使用 VSCode 开发 uniapp