我想用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改变了,如何解决?
答案 0 :(得分:1)
没有问题需要解决。您的日志输出是正确的。
比较两个矩阵,两者之间的区别是:
我要猜测一下你的观点是高约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。