gpt4 book ai didi

ios - 使用 CGContextDrawImage 旋转图像

转载 作者:技术小花猫 更新时间:2023-10-29 11:09:40 24 4
gpt4 key购买 nike

如何在中心旋转由 CGContextDrawImage() 绘制的图像?

drawRect:

CGContextSaveGState(c);

rect = CGRectOffset(rect, -rect.size.width / 2, -rect.size.height / 2);
CGContextRotateCTM(c, angle);
CGContextDrawImage(c, rect, doodad.CGImage);
CGContextRotateCTM(c, -angle);
CGContextTranslateCTM(c, pt.x, pt.y);

prevRect = rect;

CGContextRestoreGState(c);

我在原点绘制图像,然后在中心旋转它,然后平移到应该绘制的位置。不工作。

最佳答案

关于坐标变换要记住的事情——好吧,一个要记住的事情是你不是在操纵对象,就像图形编辑器中的变换命令;你正在操纵空间本身

想象一下,该设备通过鹅颈臂悬卡在 table 上方,并固定在适当的位置。坐标变换使 table 四处移动(平移),并以一种或另一种方式转动它(旋转),甚至挤压和拉伸(stretch)它(缩放)。

关于坐标变换的另一件要记住的事情是变换总是相对于原点的。想象一下,您的办公 table 从它的一个角开始——对应于您 View 的一角——就在您的 View 在屏幕上结束的角的正下方。翻译会移动 table 的一角,以及 table 的其余部分,将其以一种或另一种方式滑动到屏幕下方。旋转将 table 绕过那个角落。

还有一件事:转型影响 future ,而不是过去。画了一些东西然后试图改变它是行不通的,因为你不是在改变你画的东西,而是在改变你要画的空间。因此,我们需要移动 table 才能将图像放在正确的位置。

(我提到最后一部分是因为你有几个转换命令,它们会立即被你的 CGContextRestoreGState 调用恢复。它们之间没有绘图影响。)

那么,让我们从图像的未旋转矩形开始。

CGRect imageRect = { pointWhereYouWantTheImageCentered, doodad.size };

现在,CGContextDrawImage 获取一个矩形,但是,如您所知,它将从该矩形的左下角而非中心绘制图像。 (因此进行了整个练习。)

那么,这就是您要做的。最后,您要绘制的图像不是在上面显示的那个点,而是在零点——也就是在 table 的最角落。 (不是以角落为中心,而是图片的角在 table 的角上。)

这将如何运作?这需要一些设置。您将不得不移动办公 table 。

首先,您需要将办公 table 向上向右移动,直到办公 table 的原角位于所需的中心点:

CGContextTranslateCTM(context, imageRect.origin.x, imageRect.origin.y);

然后进行旋转(将 table 绕其原点转动):

CGContextRotateCTM(context, angleInRadians);

然后将 table 向后向左移动图像宽度和高度的一半:

CGContextTranslateCTM(context, imageRect.size.width * -0.5, imageRect.size.height * -0.5);

最后,将图像放在 table 角。

CGContextDrawImage(context, (CGRect){ CGPointZero, imageRect.size }, [doodad CGImage]);

随着您的办公 table 移动,该矩形的中心直接位于屏幕上您希望图像居中的点下方,因此图像居中。

关于ios - 使用 CGContextDrawImage 旋转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16766111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com