首先你必须要准备一个原图,和一个准备作为遮罩的掩码图(mask),这里有两点要注意,如果希望通过CGImageCreateWithMask函数去创建一个处理过的不规则的图片的话,那么你需要有一张原图是带alpha通道的图片,和一个不带alpha通道的遮罩图。
如何判断是否有alpha通道其实很简单,你在mac里右键显示简介的时候,有显示该图片的信息,其中一行就是显示是否有alpha通道。
当然其实有方法可以通过代码给一个没有alpha通道的图片加上alpha通道,然后再处理显示,具体代码如下(附送一个通过path去clip图片的)
+(UIImage*)maskImage:(UIImage*)originImage toPath:(UIBezierPath*)path{ UIGraphicsBeginImageContextWithOptions(originImage.size, NO, 0); [path addClip]; [originImage drawAtPoint:CGPointZero]; UIImage* img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; } + (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 cost if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) { imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage); } CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); CGImageRelease(mask); release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel if (sourceImage != imageWithAlpha) { CGImageRelease(imageWithAlpha); } UIImage* retImage = [UIImage imageWithCGImage:masked]; CGImageRelease(masked); return retImage; }
下面的是resize图片的代码
// resize the original image and return a new UIImage object + (UIImage *) resizeImage:(UIImage *)image size:(CGSize)newSize { UIGraphicsBeginImageContext(newSize); [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; }