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

Posted

技术标签:

【中文标题】将转换后的图像层应用于 renderInContext:【英文标题】:Applying transformed image layer to renderInContext: 【发布时间】:2011-11-12 08:41:04 【问题描述】:

背景

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

查看层次结构

1.) 条纹背景视图。

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

3.) 带有透明部分的叠加图像。此视图的 y 轴从 128 开始,大小为 768x768。

4.) 高于和低于 3,是 2 个高度为 128 的视图。

******参见下面的图片示例****

问题

目前,我可以使用[[[self view] layer] renderInContext:将整个视图的图层保存到照片库中,并且#2的转换是正确的。但是,我需要一种方法来保存仅包含 #2#3 的 768x768 (照片示例中的石灰绿色),包括 #2 的转换。如果我使用[[#2 layer] renderInContext:,我会得到原始图像,并且没有任何转换。 (请参阅下面的屏幕截图以获取#参考。

代码

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 中勾勒出的图像部分,同时保留用户的转换。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我只需要能够包含#2 和#3,它们是两个不同的UIImageView's。 @WrightsCS:#3 不是#2 的子视图吗?如果没有,您可以在渲染 #2 后将 #3 渲染到上下文中。不过,您必须应用自己的仿射变换来按预期为每一层设置上下文的原点。 每一层都是主视图的子视图,没有其他的子视图。 @WrightsCS:您可以再次使用 CTM。只需在绘制视图之前使用CGContextTranslateCTM(view.frame.origin.x, view.frame.origin.y) 调整CTM(在第2 层的情况下,在进行翻译后将其affineTransform 应用到CTM)。然后,您可以绘制第 2 层,然后是第 3 层(每个都有自己的翻译)。请注意,您需要在翻译/渲染周围保存和恢复 GState。 那么我将如何计算 #2 的 xy 如果它转换了,因为它们应该随着每次旋转/调整大小而改变,是吗?理解正确吗?

以上是关于将转换后的图像层应用于 renderInContext:的主要内容,如果未能解决你的问题,请参考以下文章

Python keras如何将卷积层转换为lstm层后的输入大小

如何使用 PIL Image.point(table) 方法将阈值应用于 256 灰度图像?

将 SVG 转换为 PNG,并将应用的图像作为 svg 元素的背景

matlab中ftt2转换后的数据是啥类型的

Camera 2 API 会降低拍摄后的质量

ISP算法及架构分析介绍