Bitmap image and image mask
About Bitmap Images and Image Masks
Creating Images
Masking Images
Masking an Image with an Image Mask
如上面三幅图所示:分别为原图片(source),提供mask的图片(mask),结果(masked)。
-(CGImageRef) CopyImageAndAddAlphaChannel :(CGImageRef) sourceImage
{CGImageRef retVal = NULL;size_t width = CGImageGetWidth(sourceImage);size_t height = CGImageGetHeight(sourceImage);CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height,8, 0, colorSpace, kCGImageAlphaPremultipliedLast);if (offscreenContext != NULL) {CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage);retVal = CGBitmapContextCreateImage(offscreenContext);CGContextRelease(offscreenContext);}CGColorSpaceRelease(colorSpace);return retVal;
}- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage {CGImageRef maskRef = maskImage.CGImage;CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),CGImageGetHeight(maskRef),CGImageGetBitsPerComponent(maskRef),CGImageGetBitsPerPixel(maskRef),CGImageGetBytesPerRow(maskRef),CGImageGetDataProvider(maskRef), NULL, false);CGImageRef sourceImage = [image CGImage];CGImageRef imageWithAlpha = sourceImage;//add alpha channel for images that don’t have one (ie GIF, JPEG, etc…)//this however has a computational costif (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) {imageWithAlpha = [self CopyImageAndAddAlphaChannel :sourceImage];}CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask);CGImageRelease(mask);//release imageWithAlpha if it was created by CopyImageAndAddAlphaChannelif (sourceImage != imageWithAlpha) {CGImageRelease(imageWithAlpha);}UIImage* retImage = [UIImage imageWithCGImage:masked];CGImageRelease(masked);return retImage;
}
Masking an Image with an Image
Masking an image with Color
代码:
- (UIImage *)maskImage:(UIImage *)image withColor:(float *)color
{CGImageRef sourceImage = image.CGImage;CGImageAlphaInfo info = CGImageGetAlphaInfo(sourceImage); if (info != kCGImageAlphaNone) {NSData *buffer = UIImageJPEGRepresentation(image, 1);UIImage *newImage = [UIImage imageWithData:buffer];sourceImage = newImage.CGImage;}CGImageRef masked = CGImageCreateWithMaskingColors(sourceImage, color);UIImage *retImage = [UIImage imageWithCGImage:masked]; CGImageRelease(masked);return retImage;
}
Masking an Image by Clipping the Context
代码:
- (void)clipContext:(CGContextRef)context withMask:(UIImage *)maskImage
{CGImageRef maskRef = maskImage.CGImage;CGImageRef masked = CGImageMaskCreate(CGImageGetWidth(maskRef),CGImageGetHeight(maskRef),CGImageGetBitsPerComponent(maskRef),CGImageGetBitsPerPixel(maskRef),CGImageGetBytesPerRow(maskRef),CGImageGetDataProvider(maskRef), NULL, false);CGContextClipToMask(context, CGRectMake(0, 0, 768, 1024), masked);CGImageRelease(masked);
}
针对第二种clip path的,我实现的效果:(左边是source,右边是masked)
另外,最后指出一点,UIImage的drawRect函数仅仅在第一次加载的时候被调用一次,之后如果在view里面添加了东西,需要刷新的时候需要调用setNeedsDisplay函数。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
