маскировать изображение через другое изображение - PullRequest
3 голосов
/ 03 сентября 2010

Хорошо, я пытаюсь сделать следующее:

  • дано изображение, где есть круг внутри этого изображения, который является "пустым". Я хочу взять существующее изображение из пользовательской библиотеки, а затем замаскировать его так, чтобы на «пустом» изображении отображалась только определенная часть этого изображения.

Я пробовал несколько маскирующих кодов, но все они, кажется, работают наоборот ... какие-нибудь советы о том, как справиться с этим?

1 Ответ

5 голосов
/ 03 сентября 2010

К сожалению, вы не можете использовать CoreAnimation для этого (что сделает это довольно просто).Посмотрите на документацию Apple CoreAnimation :

iOS Примечание. В целях повышения производительности iOS не поддерживает свойство mask.

Поэтому следующий лучший способ сделать это - использовать Кварц 2D (в ответ здесь ):

CGContextRef mainViewContentContext;
CGColorSpaceRef colorSpace;

colorSpace = CGColorSpaceCreateDeviceRGB();

// create a bitmap graphics context the size of the image
mainViewContentContext = CGBitmapContextCreate (NULL, targetSize.width, targetSize.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);

// free the rgb colorspace
CGColorSpaceRelease(colorSpace);    

if (mainViewContentContext==NULL)
    return NULL;

CGImageRef maskImage = [[UIImage imageNamed:@"mask.png"] CGImage];
CGContextClipToMask(mainViewContentContext, CGRectMake(0, 0, targetSize.width, targetSize.height), maskImage);
CGContextDrawImage(mainViewContentContext, CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledWidth, scaledHeight), self.CGImage);


// Create CGImageRef of the main view bitmap content, and then
// release that bitmap context
CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext);
CGContextRelease(mainViewContentContext);

// convert the finished resized image to a UIImage 
UIImage *theImage = [UIImage imageWithCGImage:mainViewContentBitmapContext];
// image is retained by the property setting above, so we can 
// release the original
CGImageRelease(mainViewContentBitmapContext);

// return the image
return theImage;
...