#pragma mark - 透明效果图片
- (BOOL)hasAlpha { CGImageAlphaInfo alpha = CGImageGetAlphaInfo(self.CGImage); return (alpha == kCGImageAlphaFirst || alpha == kCGImageAlphaLast || alpha == kCGImageAlphaPremultipliedFirst || alpha == kCGImageAlphaPremultipliedLast); }
- (UIImage *)imageWithAlpha { if ([self hasAlpha]) { return self; } CGFloat scale = MAX(self.scale, 1.0f); CGImageRef imageRef = self.CGImage; size_t width = CGImageGetWidth(imageRef)*scale; size_t height = CGImageGetHeight(imageRef)*scale; CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, 8, 0, CGImageGetColorSpace(imageRef), kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst); CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), imageRef); CGImageRef imageRefWithAlpha = CGBitmapContextCreateImage(offscreenContext); UIImage *imageWithAlpha = [UIImage imageWithCGImage:imageRefWithAlpha scale:self.scale orientation:UIImageOrientationUp]; CGContextRelease(offscreenContext); CGImageRelease(imageRefWithAlpha); return imageWithAlpha; }
- (UIImage *)transparentBorderImage:(NSUInteger)borderSize { UIImage *image = [self imageWithAlpha]; CGFloat scale = MAX(self.scale, 1.0f); NSUInteger scaledBorderSize = borderSize * scale; CGRect newRect = CGRectMake(0, 0, image.size.width * scale + scaledBorderSize * 2, image.size.height * scale + scaledBorderSize * 2); CGContextRef bitmap = CGBitmapContextCreate(NULL, newRect.size.width, newRect.size.height, CGImageGetBitsPerComponent(self.CGImage), 0, CGImageGetColorSpace(self.CGImage), CGImageGetBitmapInfo(self.CGImage)); CGRect imageLocation = CGRectMake(scaledBorderSize, scaledBorderSize, image.size.width*scale, image.size.height*scale); CGContextDrawImage(bitmap, imageLocation, self.CGImage); CGImageRef borderImageRef = CGBitmapContextCreateImage(bitmap); CGImageRef maskImageRef = [self newBorderMask:scaledBorderSize size:newRect.size]; CGImageRef transparentBorderImageRef = CGImageCreateWithMask(borderImageRef, maskImageRef); UIImage *transparentBorderImage = [UIImage imageWithCGImage:transparentBorderImageRef scale:self.scale orientation:UIImageOrientationUp]; CGContextRelease(bitmap); CGImageRelease(borderImageRef); CGImageRelease(maskImageRef); CGImageRelease(transparentBorderImageRef); return transparentBorderImage; }
* 创建透明边框 * * @param borderSize 边框宽度 * @param size 尺寸 * * @return */ - (CGImageRef)newBorderMask:(NSUInteger)borderSize size:(CGSize)size { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGContextRef maskContext = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaNone); CGContextSetFillColorWithColor(maskContext, [UIColor blackColor].CGColor); CGContextFillRect(maskContext, CGRectMake(0, 0, size.width, size.height)); CGContextSetFillColorWithColor(maskContext, [UIColor whiteColor].CGColor); CGContextFillRect(maskContext, CGRectMake(borderSize, borderSize, size.width - borderSize * 2, size.height - borderSize * 2)); CGImageRef maskImageRef = CGBitmapContextCreateImage(maskContext); CGContextRelease(maskContext); CGColorSpaceRelease(colorSpace); return maskImageRef; }
|