import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class MainClass {
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
Container cp = jf.getContentPane();
MyCanvas tl = new MyCanvas();
cp.add(tl);
jf.setSize(300, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MyCanvas extends JComponent {
Shape shape;
public MyCanvas() {
shape = create();
}
protected Shape create() {
float cm = 30f;
return new Rectangle2D.Float(2*cm, 2*cm, cm, cm);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.black);
g2.draw(shape);
AffineTransform trans = new AffineTransform();
trans.scale(-1, 1);
trans.translate(-120, 0);
g2.transform(trans);
g2.setPaint(Color.red);
g2.draw(shape);
}
}
这种效果就是翻转之后再往后移120,但如果这样又为何会如此:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class MainClass {
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
Container cp = jf.getContentPane();
MyCanvas tl = new MyCanvas();
cp.add(tl);
jf.setSize(300, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MyCanvas extends JComponent {
Shape shape;
public MyCanvas() {
shape = create();
}
protected Shape create() {
float cm = 30f;
return new Rectangle2D.Float(2*cm, 2*cm, cm, cm);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.black);
g2.draw(shape);
AffineTransform trans = new AffineTransform();
trans.scale(-1, 1);
g2.transform(trans);
trans.translate(-30, 0);
g2.transform(trans);
g2.setPaint(Color.red);
g2.draw(shape);
}
}
结果与上图一样,怎么会这样呢,按理往后移30应该是看不到,原因是这里多了句
g2.transform(trans);
这句是什么作用呢,看解释:
Composes an AffineTransform
object with the
Transform
in this Graphics2D
according to the rule
last-specified-first-applied. If the current Transform
is Cx, the
result of composition with Tx is a new Transform
Cx'. Cx' becomes
the current Transform
for this Graphics2D
.
Transforming a point p by the updated Transform
Cx' is equivalent
to first transforming p by Tx and then transforming the result by the original
Transform
Cx. In other words, Cx'(p) = Cx(Tx(p)). A copy of the Tx
is made, if necessary, so further modifications to Tx do not affect rendering.
Parameters:
Tx
- the AffineTransform
object to be composed
with the current Transform
这里貌似是有问题的,Cx'怎么感觉就没翻转过呢,就感觉scale和transform两句没有发生作用一样,这是怎么回事呢?原因就是负负得正了,翻转两次,效果取消,看下文:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class MainClass {
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
Container cp = jf.getContentPane();
MyCanvas tl = new MyCanvas();
cp.add(tl);
jf.setSize(300, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MyCanvas extends JComponent {
Shape shape;
public MyCanvas() {
shape = create();
}
protected Shape create() {
float cm = 30f;
return new Rectangle2D.Float(2*cm, 2*cm, cm, cm);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.translate(90, 0);
g2.setPaint(Color.black);
g2.draw(shape);
g2.drawLine(0, 0, 0, 5);
g2.drawLine(-30, 0, -30, 5);
g2.drawLine(-60, 0, -60, 5);
g2.drawLine(-90, 0, -90, 5);
g2.drawLine(-120, 0, -120, 5);
g2.drawLine(30, 0, 30, 5);
g2.drawLine(60, 0, 60, 5);
g2.drawLine(90, 0, 90, 5);
g2.drawLine(120, 0, 120, 5);
g2.drawLine(150, 0, 150, 5);
g2.drawLine(180, 0, 180, 5);
AffineTransform trans = new AffineTransform();
trans.scale(-1, 1);
g2.transform(trans);
g2.transform(trans);
g2.setPaint(Color.red);
g2.draw(shape);
}
}
这里有完备的教程:
http://www.glyphic.com/transform/applet/1intro.html
记住一点,这个对象AffineTransform是面向坐标系操作的,也就是说它的操作对象是坐标系。
- 大小: 7.5 KB
- 大小: 7.7 KB
分享到:
相关推荐
主要介绍了Java中AffineTransform类的使用,AffineTransform类经常被用来处理图片,需要的朋友可以参考下
对图像做仿射变换,来实现对图像更好的处理,这是主程序cpp
本指标传送价格数据到新的坐标系统上转换价格轴(纵坐标轴)。
目 录 欢迎使用... . . . . . . . ....MapInfo MapX 的新增功能 ....关于 MapInfo ....第 1 章: MapX 简介 ....地图绘制简介 ....使 MapX 适合您工作 ....主要功能概述 ....学习 MapX....第 2 章: MapX 基础 ....Map 对象 ....
import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
AffineTransform transform = new AffineTransform(); transform.setToTranslation(w/2-sw/2,h/2); Shape shape = tl.getOutline(transform); g2.setClip(shape); g2.setColor(Color.blue); g2.fill(shape....
import java.awt.geom.AffineTransform; import java.io.*;//数据流、序列化和文件系统提供系统输入和输出 import java.util.ArrayList;//最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作...
AffineTransform trans = new AffineTransform(); trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 10, 7); // 缩放文字 float scaleSize = random.nextFloat() + 0.8f; if (scaleSize > 1.1f) scale...
* 图像变换:使用 AffineTransform 对象实现图像变换,如旋转、翻转、缩放等。 * 图像识别:使用 OpenCV 等技术实现图像识别,如人脸识别、物体识别等。 Java 图像处理技术提供了多种方式来处理和操作图像,从而...
AffineTransform对象, AffineTransform对象使您可以定义旋转或倾斜的坐标系。
1.1. Graphics2d 方式 1.2. AffineTransform 方式 1.3 参考
Java实现图片的拖拉变形放大缩小,四个方向都可以拉大缩小图片,技术方面,使用java.awt.geom 包中的AffineTransform 类来实现图片拖拉缩放功能。
图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理。本文的程序使用jdk1.4中最新的ImageIO对图片进行读写,使用AffineTransform对图片进行缩放。
它使用AffineTransform类来移动和旋转几何对象,这就是为什么它在算法上不快的原因。 音乐来自Freesound.org。 在游戏中,音乐由orangefreesound制作,其名称为“ 115 bpm的电子音乐循环”。 激光射击声是由...
实现AffineTransform类 实现最近邻插值类 实现双线性插值层 在GeometricTransformer类中实现Transform函数 放大和缩小图像 调整图像大小 围绕中心旋转图像(保留图像内容) 围绕中心旋转图像(不保留图像内容) ...
摘要:Java源码,图形操作,图片拉伸,图像放大 Java拉伸缩放图像,滑动滑块时,图像实时地在相应的方向上拉伸...具体来说是使用java.awt.geom 包中的AffineTransform 类,来实现图像的拉伸缩放。 运行环境:Java/Eclipse
import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import ...
随机生成四位数验证码,包括汉字,数字,英文大小写。 1.Servlet类 ...import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.image.BufferedImage; import java.i