我正在尝试使用图像(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(),但我不确定。
任何帮助将不胜感激
谢谢
答案 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 );