2

我有一个上下文,我在上面进行了一些绘图。现在我想保存一个结果。由于反转上下文 y 轴首先我想翻转所有内容,然后创建图像:

// 1. Flip Y
CGContextTranslateCTM(context, 0, height);
CGContextScaleCTM(context, 1.0, -1.0);

// 2. Create image
CGImageRef rawMask = CGBitmapContextCreateImage(context);

但是图像没有翻转。即使我用 2 更改动作 1 的顺序,图像仍然没有翻转。我不明白为什么以及如何解决它。更重要的是“为什么”,因为在我的逻辑中,如果我用颠倒的绘图翻转上下文,应该没问题。

4

2 回答 2

2

CTM 会影响您在设置 CTM 后执行的绘图操作。也就是说,改变CTM可以改变你后续的绘图操作修改了哪些像素。

CTM 不CGBitmapContextCreateImage直接影响。 CGBitmapContextCreateImage只需将像素从上下文中复制到图像中。它根本不看CTM。

因此,您从问题中省略了程序的关键部分:实际修改像素的部分。正确的顺序是这样的:

// 1. Flip Y axis.
CGContextTranslateCTM(context, 0, height);
CGContextScaleCTM(context, 1.0, -1.0);

// 2. Draw into context.  For example:
CGContextBeginPath(context);
CGContextAddEllipseInRect(context, someRect);
CGContextSetFillColorWithColor(context, ...);
CGContextFillPath(context);

// 3. Create image.
CGImageRef rawMask = CGBitmapContextCreateImage(context);
于 2013-08-16T06:26:01.330 回答
0
CGContextRef context = UIGraphicsGetCurrentContext(); //Check if this is valid

CGContextTranslateCTM(context, 0, height);
CGContextScaleCTM(context, 1.0, -1.0);

CGImageRef rawMask = CGBitmapContextCreateImage(context);
UIImage* img = [UIImage imageWithCGImage:rawMask];
CGImageRelease(imgRef);

如果UIGraphicsGetCurrenContext();无效,则:

如果你只想要一个图像:使用 UIGraphicsBeginImageContext() 创建上下文,然后使用 UIGraphicsGetImageFromCurrentImageContext() 提取 UIImage(不需要中间的 CGImage),然后使用 UIGraphicsEndImageContext() 进行清理。

于 2013-08-16T06:18:47.497 回答