java drawImage 如何实现旋转和缩放

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java drawImage 如何实现旋转和缩放相关的知识,希望对你有一定的参考价值。

public abstract boolean drawImage(Image img,
int dx1,
int dy1,
int dx2,
int dy2,
int sx1,
int sy1,
int sx2,
int sy2,
ImageObserver observer)
参数:
img - 要绘制的指定图像。如果 img 为 null,则此方法不执行任何操作。
dx1 - 目标矩形第一个角的 x 坐标。
dy1 - 目标矩形第一个角的 y 坐标。
dx2 - 目标矩形第二个角的 x 坐标。
dy2 - 目标矩形第二个角的 y 坐标。
sx1 - 源矩形第一个角的 x 坐标。
sy1 - 源矩形第一个角的 y 坐标。
sx2 - 源矩形第二个角的 x 坐标。
sy2 - 源矩形第二个角的 y 坐标。
observer - 当缩放并转换了更多图像时要通知的对象。

我的理解是这样的: 矩形的4个顶点A,B,C,D,如果实现旋转90度,就应该是
A to B
B to C
C to D
D to A
当我尝试去传入A,B两个点的值的时候,结果旋转后图像不显示。
我觉得可能是我的思路有问题,特此请教,该函数用法,及思路。有源码更好哈。

这个函数可以缩放,不能旋转。头四个数是画到什么地方,后四个数是画那幅图的哪个部分,也就是可以光画图的一半等等。

public void paint(Graphics g)
Graphics2D g2 = (Graphics2D)g;
AffineTransform at = new AffineTransform();
double angle = Math.PI;
at.rotate(angle);
int transX = 100;
int transY = 100;
at.translate(transX, transY);
Image img = new BufferedImage();
g2.drawImage(img, at, null);
参考技术A A to B
B to C
C to D
D to A

怎么可能?
你想象 矩形旋转的时候是坐标这样变换吗?
参考技术B 旋转有AffineTransform这个类,这个类包含了图片所有的处理,使用graphics2d来进行描画。

颤动 - 如何使用画布围绕中心旋转图像

我正在尝试实现一个可以在画布上绘制图像(缩小版本)的自定义画家,并且可以旋转和缩放绘制的图像。

我知道要缩放图像我必须使用缩放方法缩放画布。

现在的问题是如何在其中心(或任何其他点)旋转缩放图像。画布的旋转方法只允许在左上角旋转。

Here is my implementation that can be extended

答案

figure 1 figure 2

这可以通过移动坐标空间来实现,如图1所示。平移是C1和C2之间坐标的差异,正如图2中的A和B之间的差异。通过一些几何公式,我们可以计算出所需的平移和产生旋转图像,如下面的方法

ui.Image rotatedImage({ui.Image image, double angle}) {
  var pictureRecorder = ui.PictureRecorder();
  Canvas canvas = Canvas(pictureRecorder);

  final double r = sqrt(image.width * image.width + image.height * image.height) / 2;
  final alpha = atan(image.height / image.width);
  final beta = alpha + angle;
  final shiftY = r * sin(beta);
  final shiftX = r * cos(beta);
  final translateX = image.width / 2 - shiftX;
  final translateY = image.height / 2 - shiftY;
  canvas.translate(translateX, translateY);
  canvas.rotate(angle);
  canvas.drawImage(image, Offset.zero, Paint());

  return pictureRecorder.endRecording().toImage(image.width, image.height);
}

以上是关于java drawImage 如何实现旋转和缩放的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV新手入门,如何用它平移缩放和旋转图片

canvas做动画

JAVA的问题g.drawImage第四个代表啥

使用 drawImage 缩放透明图像时出现故障

颤动 - 如何使用画布围绕中心旋转图像

Android实现对图片的缩放剪切旋转存储