CGImageCreateWithMask用图像作为掩码

时间:2010-05-31 02:39:42

标签: cgimage

我正在尝试使用图像(270度的圆圈,类似于pacman徽标,绘制为Core Graphics)来创建蒙版。我正在做的是这个

1。创建核心图形路径

    CGContextSaveGState(context);
    CGContextBeginPath(context);
    CGContextMoveToPoint(context,circleCenter.x,circleCenter.y);
    //CGContextSetAllowsAntialiasing(myBitmapContext, YES);
    CGContextAddArc(context,circleCenter.x, circleCenter.y,circleRadius,startingAngle, endingAngle, 0); // 0 is counterclockwise
    CGContextClosePath(context);
    CGContextSetRGBStrokeColor(context,1.0,0.0,0.0,1.0);
    CGContextSetRGBFillColor(context,1.0,0.0,0.0,0.2);
    CGContextDrawPath(context, kCGPathFillStroke);

2。然后我正在创建一条路径图像,其中包含刚刚绘制的路径

    CGImageRef pacmanImage              = CGBitmapContextCreateImage (context); 

第3。恢复背景

CGContextRestoreGState(context);
CGContextSaveGState(context);

4。创建1位掩码(将提供黑白掩码)

bitsPerComponent                    = 1;
bitsPerPixel                        = bitsPerComponent * 1 ;
bytesPerRow                         = (CGImageGetWidth(imgToMaskRef) * bitsPerPixel);
mask                                = CGImageCreate(CGImageGetWidth(imgToMaskRef), 
                                                CGImageGetHeight(imgToMaskRef), 
                                                bitsPerComponent,
                                                bitsPerPixel, 
                                                bytesPerRow, 
                                                greyColorSpace,
                                                kCGImageAlphaNone, 
                                                CGImageGetDataProvider(pacmanImage), 
                                                NULL, //decode
                                                YES, //shouldInterpolate
                                                kCGRenderingIntentDefault);

5。使用刚刚创建的掩码屏蔽imgToMaskRef(这是一个CGImageRef imgToMaskRef = imgToMask.CGImage;)

    imageMaskedWithImage                = CGImageCreateWithMask(imgToMaskRef, mask);
CGContextDrawImage(context,imgRectBox, imageMaskedWithImage);
CGImageRef maskedImageFinal         = CGBitmapContextCreateImage (context);

6。将maskedImageFinal返回给此方法的调用者(作为wheelChoiceMadeState,这是一个CGImageRef),然后使用图像更新CALayer内容属性

 theLayer.contents                  = (id) wheelChoiceMadeState;

我看到的问题是面具不能正常工作,看起来确实很奇怪。我在Core Graphics绘制的路径上得到了奇怪的图案。我的预感是有一些CGImageGetDataProvider(),但我不确定。

任何帮助将不胜感激

谢谢

1 个答案:

答案 0 :(得分:1)

CGImageGetDataProvider根本不会更改数据。如果pacmanImage的数据与传递给CGImageCreate(bitsPer,bytesPer,colorSpace,...)的参数不完全匹配,则结果是未定义的。如果它完全匹配,那么创建蒙版就没有意义了。

您需要创建一个灰度级CGBitmapContext来绘制蒙版,以及一个CGImage,它使用与位图相同的像素和参数。然后,您可以使用CGImage屏蔽另一个图像。

如果您想要继续修改CGBitmapContext的快照,请仅使用CGBitmapContextCreateImage。对于单次使用位图,将相同的缓冲区传递给位图和您创建的匹配CGImage。

编辑:

finalRect是最终图像的大小。它或者足够大以容纳原始图像,并且pacman位于其中,或者它足够大以容纳pacman,并且原始图像被裁剪以适合。在此示例中,裁剪原始图像。否则,必须相对于原始图像定位pacman路径。

maskContext = CGBitmapContextCreate( ... , finalRect.size.width , finalRect.size.height , ... );
// add the pacman path and set the stroke and fill colors
CGContextDrawPath( maskContext , kCGPathFillStroke );
maskImage = CGBitmapContextCreateImage( maskContext );
imageToMask = CGImageCreateWithImageInRect( originalImage , finalRect );
finalImage = CGImageCreateWithMask( imageToMask , maskImage );