0

我想用它来绘制 UIimageCGAffineTransform但它给出了错误的输出CGContextConcatCTM

我尝试使用以下代码:

 CGAffineTransform t = CGAffineTransformMake(1.67822, -1.38952, 1.38952, 1.67822, 278.684, 209.129); // transformation of uiimageview
 UIGraphicsBeginImageContext(CGSizeMake(1024, 768));
 CGContextRef imageContext = UIGraphicsGetCurrentContext();
 CGContextDrawImage(imageContext, dragView.frame, dragView.image.CGImage);
 CGContextConcatCTM(imageContext, t);

 NSLog(@"\n%@\n%@", NSStringFromCGAffineTransform(t),NSStringFromCGAffineTransform(CGContextGetCTM(imageContext)));

输出 :

  [1.67822, -1.38952, 1.38952, 1.67822, 278.684, 209.129] // imageview transformation
  [1.67822, 1.38952, 1.38952, -1.67822, 278.684, 558.871] // drawn image transformation

CGAffineTransform CGAffineTransformMake (
   CGFloat a,
   CGFloat b,
   CGFloat c,
   CGFloat d,
   CGFloat tx,
   CGFloat ty
);

参数 b、d 和 ty 改变了,如何解决?

4

1 回答 1

1

没有问题要解决。您的日志输出是正确的。

比较两个矩阵,两者的区别是这样的:

  • 垂直缩放 -1(影响前四个成员中的两个)
  • 垂直平移 349.742(影响最后一个成员)

我要猜测一下,说你的观点大约是 350 点高。我对吗?实际上,349.742 很奇怪,因为您将上下文的高度设置为 768。它几乎是一半(可能是因为锚点居中?),但很短,并且在这里切断状态栏没有意义(而且不会' t 占 68.516 点的差异)。所以这是一个谜。但是,以下内容仍然正确:

垂直缩放和平移是翻转上下文的方式。此上下文已从左下原点变为左上原点,反之亦然。

这发生你连接你的(无法解释的,硬编码的)矩阵之前。假设你没有自己翻转上下文,它可能是这样的(我猜是 UIKit 的实现细节)。

连接(如CGContextConcatCTM)不会用新的变换矩阵替换旧的变换矩阵;它是矩阵乘法。你之后的矩阵是你开始使用的矩阵和你连接到它的矩阵的乘积。生成的矩阵都被翻转,然后……无论你的矩阵做什么。

您可以通过简单地在将矩阵连接到它之前获取 CTM 并记录它来亲自看到这一点。你应该看到这个:

[0, -1, 0, -1, 0, 349.742]

另请参阅Quartz 2D 编程指南中的“矩阵背后的数学”

于 2013-06-13T09:04:49.910 回答