1

我想在屏幕外渲染中使用 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???
4

2 回答 2

3

我通常编写 Swift 代码,但曾经我还必须处理屏蔽和 CGLayer。

我通过以下步骤解决了这个问题:

  1. 画出你的面具
  2. 将混合模式更改为CGBlendMode.sourceIn
  3. 画出你的“彩色”图像。

这是因为CGBlendMode.sourceIn告诉上下文将源图像的 alpha 值与现有像素的颜色相乘。因此,遮罩 ( ) 的不可见部分alpha = 0.0将保持不可见。

CGBlendMode 的 Apple 文档:https ://developer.apple.com/documentation/coregraphics/cgb​​lendmode

于 2018-02-11T17:48:24.903 回答
1

它并没有真正回答这个问题,但我最终使用了传统的方法,例如CGContextClipToMaskCGContextDrawImage但我设法在掩蔽之前获得了我想要的高质量。再次,我需要提一下,这仅在我的情况下有效(它用渲染的贝塞尔路径掩盖了图像,但图像的全分辨率)如果您有相同的问题以获取更多信息,您可以在此处查看我的其他相关问题

使用具有图像全分辨率的 bezierpath 屏蔽图像

以及我的 github 工作项目。

https://github.com/Reza-Abdolahi/HighResMasking

这是对我有用的代码:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGImageRef maskImageRef = [_maskImage CGImage];
    CGContextRef myContext = CGBitmapContextCreate (NULL, _highResolutionImage.size.width, _highResolutionImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colorSpace);
    if (myContext==NULL)
        return NULL;

    CGFloat ratio = 0;
    ratio = _maskImage.size.width/ _highResolutionImage.size.width;
    if(ratio * _highResolutionImage.size.height < _maskImage.size.height) {
        ratio = _maskImage.size.height/ _highResolutionImage.size.height;
    }

    CGRect rectForMask  = {{0, 0}, {_maskImage.size.width, _maskImage.size.height}};
    CGRect rectForImageDrawing  = {{-((_highResolutionImage.size.width*ratio)-_maskImage.size.width)/2 , -((_highResolutionImage.size.height*ratio)-_maskImage.size.height)/2},
        {_highResolutionImage.size.width*ratio, _highResolutionImage.size.height*ratio}};

    CGContextClipToMask(myContext, rectForMask, maskImageRef);
    CGContextDrawImage(myContext, rectForImageDrawing, _highResolutionImage.CGImage);
    CGImageRef newImage = CGBitmapContextCreateImage(myContext);
    CGContextRelease(myContext);
    UIImage *theImage = [UIImage imageWithCGImage:newImage];
    CGImageRelease(newImage);
    return theImage;
于 2018-02-11T19:28:01.197 回答