使用AffineTransform旋转后跟踪像素

时间:2016-06-17 19:16:50

标签: java

我正在使用一个名为&#34的BufferedImage; img"并使用仿射变换功能旋转Pi / 2弧度。以下是上述说明的代码:

BufferedImage img = ImageIO.read(new File(filePath));

AffineTransform tx = new AffineTransform();
tx.rotate(3.14/2, img.getWidth() / 2, img.getHeight() / 2);

AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_BILINEAR);
img = op.filter(img, null);

然而,在这个缓冲的图像中,我在位置(x,y)处有一个像素,我试图跟踪后旋转。我想知道我应该如何遵循这个像素的位置?我不确定AffineTransform如何在数学上旋转图像,所以我希望有人能够在轮换后跟踪像素的位置。

3 个答案:

答案 0 :(得分:0)

首先,确定AffineTransform是顺时针还是逆时针移动图像(可能是基于单位圆角的逆时针方向)。如果它顺时针移动,则点(x,y)对应于(-y,x),否则如果是逆时针,则对应于(y,-x)。

答案 1 :(得分:0)

我会使用以下

AffineTransform tx = new AffineTransform();
tx.rotate(3.14/5, img.getWidth() / 2, img.getHeight() / 2);

AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_BILINEAR);
BufferedImage img2 = op.filter(img, null);

g2.drawImage(img, 0, 0, null);
g2.drawImage(img2, 0, 0, null);
g2.setColor(Color.magenta);
Point2D.Double p2=(Point2D.Double)op.getPoint2D(new Point2D.Double(10, hc/2), null);
g2.fillOval(10, hc/2, 5, 5);
g2.setColor(Color.red);
g2.fillOval((int)p2.x, (int)p2.y, 5, 5);
System.out.println(p2.toString());
虽然它的数学精度值得怀疑,但可以“或多或少”的意义使用。您可以使用自己的实验确认相关方法的位置

  Point2D.Double p2=(Point2D.Double)op.getPoint2D(new Point2D.Double(x, y), null);

答案 2 :(得分:0)

AffineTransform有一个transform()方法,需要Point2D。试试这个:

Point pt = new Point(10, 10);  // replace 10, 10 with your pixel location
Point transformedPt = tx.transform(pt, null);  // this is the new post-tx location