使用CGAffineTransform和CGContextDrawImage绘制图像

时间:2013-06-13 06:41:15

标签: iphone objective-c core-graphics cgcontext cgaffinetransform

我想用CGAffineTransform绘制UIimage,但它使用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改变了,如何解决?

1 个答案:

答案 0 :(得分:1)

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

比较两个矩阵,两者之间的区别是:

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

我要猜测一下你的观点是高约350点。我是对的吗?实际上,349.742很奇怪,因为你将上下文的高度设置为768.它几乎一半(也许是因为锚点居中?),但很短,切断状态栏在这里没有意义(并且不会考虑68.516点的差异)。所以这是一个难题。但是,接下来的事情仍然是正确的:

垂直刻度和平移是how you would flip a context。此上下文从左下角原点到左上角原点,反之亦然。

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

连接(如CGContextConcatCTM中所述)不会用新的转换矩阵替换旧的转换矩阵;它是矩阵乘法。之后的矩阵是您开始使用的矩阵和连接到它的矩阵的乘积。结果矩阵都被翻转然后......无论你的矩阵是什么。

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

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

另见“The Math Behind the Matrices” in the Quartz 2D Programming Guide