将转换后的图像层应用于 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 的 x 和 y 如果它转换了,因为它们应该随着每次旋转/调整大小而改变,是吗?理解正确吗?以上是关于将转换后的图像层应用于 renderInContext:的主要内容,如果未能解决你的问题,请参考以下文章
Python keras如何将卷积层转换为lstm层后的输入大小
如何使用 PIL Image.point(table) 方法将阈值应用于 256 灰度图像?