【发布时间】:2018-07-21 21:52:40
【问题描述】:
我想在屏幕外渲染中使用 CGLayerRef 用另一张图片遮盖一张图片,因为它适用于文档中提到的高质量渲染
核心图形图层绘图: CGLayer 对象允许您的应用程序使用图层进行绘图。 图层适用于以下情况: 高质量的离屏渲染 计划重复使用的绘图。
但是我在 Objective-c 中找不到任何可以理解其工作原理的示例。在我的上下文中,我想用我以前这样做的形状图像(纯色形状)来掩盖图像
//The context I use to mask my image with the mask image.
CGColorSpaceRef colorSpace= CGColorSpaceCreateDeviceRGB();
CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, _bigImageRect.size.width, _bigImageRect.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
//Mask image
CGContextClipToMask(mainViewContentContext,
CGRectMake(0,
-_bigImageRect.origin.y,
_bigImageRect.size.width,
_bigImageRect.size.height),
_maskImage.CGImage);
//Drawing the image on the mask image.
CGContextDrawImage(mainViewContentContext,
CGRectMake(0,
0,
_bigImageRect.size.width,
_bigImageRect.size.height),
_ImageToBeMasked.CGImage);
CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext);
CGContextRelease(mainViewContentContext);
UIImage*maskedImage = [UIImage imageWithCGImage:mainViewContentBitmapContext];
CGImageRelease(mainViewContentBitmapContext)
return maskedImage;
但是如何使用 CGLayers 进行如下遮罩?感谢您的帮助。
CGLayerRef layer = CGLayerCreateWithContext(mainViewContentContext, _bigImageRect.size, NULL);
CGContextDrawLayerInRect(mainViewContentContext, _bigImageRect, layer);
CGLayerRelease(layer);
//And then.. how can I do the masking using this CGLayerRef???
【问题讨论】:
-
"我想使用 CGLayerRef 用另一张图像遮盖一张图像" 但是如果 CGLayerRef 不是一种遮盖方法怎么办?
-
我必须使用这种方式的原因是我已经尝试了所有可能的方法来在屏幕外进行“高质量”掩蔽,是的,我曾经做过 imageView.layer.mask = maskImageView.layer 但这是低质量的屏幕遮罩。我上面的当前代码有效,但我遇到的问题是 CGContextDrawImage 和 CGContextClipToMask 显示的奇怪定位。尽管我了解 Core Graphics 使用 LLO,但蒙版的位置仍然没有意义。所以我决定使用 CGLayer,因为文档说它是高质量离屏渲染的方式。 @马特
-
"imageView.layer.mask = maskImageView.layer 但这是低质量的屏幕遮罩" 这是真的,但这只是因为您将它应用到图像视图的图层。您可以将
mask应用到任何 层,包括屏幕外的层。至于“低质量”,一切都取决于图层的contentsScale,不是吗?如果你创建了一个 CALayer 并且它不是界面的一部分,并且你忘记设置它的contentsScale,那么你只能怪你自己。 -
重点是,我发现您的问题中的条款具有误导性。在我看来,这是一个 x-y 问题。与其坚持我们用 CGLayer 来回答,你不应该更开放一些吗?如果问题是如何掩饰,您不应该只问这个问题,而不是说“除了以下条款外不要回答”,尤其是在这些条款不合适的情况下?
-
我之所以问“如何用 CGLayerRef 做到这一点”是因为我已经尝试了所有可能的方法。如果您有任何方法可以想出,那就更好了,关于“如果您创建一个 CALayer 并且它不是界面的一部分,并且您忘记设置它的 contentsScale”是的,我之前尝试过,但它没有t 给我高质量的蒙版图像。也许您通过 CALayer 进行遮罩的方式可以在屏幕外工作,但我不确定您如何使用它。 @马特
标签: ios objective-c uiimage core-graphics cgcontextref