Core Graphics invertido alfa

Actualmente estoy teniendo problemas con CCClippingNode en Cocos2D y las transiciones como se indica aquí . Ahora Viktor (autor de SpriteBuilder) dio un consejo que podría enmascarar la image con Core Graphics.

Lo que ahora estoy haciendo, y funciona. Sin embargo Core Graphics usa el alfa exactamente lo contrario para enmascarar como Cocos2d. ¿Es posible invertir el valor alfa de un UIImage (escala de grises) sobre la marcha?

Si quiero enmascarar un círculo de una image con Cocos, necesitaría esta máscara.

Máscara de coco

pero debe ser esto en charts centrales.

Core Graphics

¿Es posible crear la image inferior de la image superior sobre la marcha? (por ejemplo, invertir su alfa)

¿Cómo convertir el canal alfa de UIImage / CGImageRef a la máscara?

La respuesta de Ben a la pregunta vinculada resuelve invertir alfa del UIImage dado. Simplemente borre / comente la siguiente sección del código

for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { unsigned char val = alphaData[y*strideLength + x]; val = 255 - val; alphaData[y*strideLength + x] = val; } 

PS: no podría agregar comentario.

Obtengo la respuesta basada en los honores de respuesta para @Tommy

 CGSize size = finalImage.size; int width = size.width; int height = size.height; // Create a suitable RGB+alpha bitmap context in BGRA colour space CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); unsigned char *memoryPool = (unsigned char *)calloc(width*height*4, 1); CGContextRef context = CGBitmapContextCreate(memoryPool, width, height, 8, width * 4, colourSpace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast); CGColorSpaceRelease(colourSpace); // draw the current image to the newly created context CGContextDrawImage(context, CGRectMake(0, 0, width, height), [finalImage CGImage]); // run through every pixel, a scan line at a time... for(int y = 0; y < height; y++) { // get a pointer to the start of this scan line unsigned char *linePointer = &memoryPool[y * width * 4]; // step through the pixels one by one... for(int x = 0; x < width; x++) { if(linePointer[3]){ linePointer[3]=255-linePointer[3]; } linePointer += 4; } } // get a CG image from the context, wrap that into a // UIImage CGImageRef cgImage = CGBitmapContextCreateImage(context); UIImage *returnImage = [UIImage imageWithCGImage:cgImage]; // clean up CGImageRelease(cgImage); CGContextRelease(context); free(memoryPool); //use returnImage as you want