将变换后的图像层应用于renderInContext:

时间:2011-09-07 17:11:27

标签: ios ipad core-graphics calayer layer

背景

我正在使用来自Chapter 8, Example 14 — Resize and Rotate的Erica Saduns Cookbook示例来明显调整大小并旋转UIImageView

VIew层次结构

  

1。)条纹背景视图。

     

2。)可以调整大小和旋转的交互式视图。

     

3.)具有透明部分的叠加图像。此视图在128处开始y轴,为768x768。

     

4。)上方和下方3,高度为2个视图128。

     

******见下面的照片示例****

问题

目前,我可以使用[[[self view] layer] renderInContext:将整个视图的图层保存到照片库,#2 的转换是正确的。但是,我需要一种方法来保存 768x768 (图片中的柠檬绿) 框架,其中仅包含#2 #3 ,包括#2 的转换。如果我使用[[#2 layer] renderInContext:,我会获得原始图像,而不会进行转换。 (参见下面的#reference参考。

代码

CGSize deviceSpec;
if ( IDIOM == IPAD ) { deviceSpec =CGSizeMake(768,768); } else { deviceSpec =CGSizeMake(320,480); }
if (  scale > 1.5  ) {
    UIGraphicsBeginImageContextWithOptions(deviceSpec, NO, scale);
} else {
    UIGraphicsBeginImageContext( deviceSpec );
}        

    CGContextRef ctx = UIGraphicsGetCurrentContext();      

    [[stripedBg layer] renderInContext:ctx];  //#1    

        CGContextSaveGState(ctx);

            CGContextConcatCTM(ctx, [[interactiveImage layer] affineTransform]);

            //CGContextTranslateCTM(ctx, interactiveImage.frame.origin.x,interactiveImage.frame.origin.y-128);

            [[interactiveImage layer] renderInContext:ctx]; // #2

        CGContextRestoreGState(ctx);

    [[overlayImage layer] renderInContext:ctx]; // #3

    UIImage * draft = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

照片示例

我只需要 LIME GREEN 中列出的图像部分,同时保留用户的转换。

enter image description here

1 个答案:

答案 0 :(得分:17)

如果我理解正确,问题是您只想渲染第2层,但第2层是否只有在渲染该层时才会保留?在将图层渲染到该上下文之前,可以将这些变换应用于图形上下文的CTM(当前变换矩阵)。这样的事情应该有效:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextConcatCTM(ctx, [layer2 affineTransform]);
[layer2 renderInContext:ctx];
CGContextRestoreGState(ctx);

注意,只有在绘制图层后想要在上下文中绘制更多内容时,才需要调用CGContextSaveGState()CGContextRestoreGState()。如果您想要图层,则可以省略它们。