【问题标题】:Draw image with CGAffineTransform and CGContextDrawImage使用 CGAffineTransform 和 CGContextDrawImage 绘制图像
【发布时间】:2013-06-13 06:41:15
【问题描述】:

我想用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变了,怎么解决?

【问题讨论】:

  • 您最初是如何得出这些价值观的?
  • 另外,图像是倒置显示(或以其他方式显示错误),还是只是您关心的日志输出?
  • 是的,这只是日志输出
  • 我认为这是核心图形和UIKit坐标系的问题。我不确定.. 但我不知道如何将其转换为 Core Graphics 坐标系。
  • 顺便说一句,你真的不应该硬编码这样的大小。根据您正在做的事情,您应该获取视图的框架、窗口的框架或屏幕的框架,并使用其中的大小。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多