Используйте CGContextClip, чтобы обрезать круг с изображением
В моем приложении есть imageViewA (frame{0,0,320,200}), и я хочу обрезать круг с центром imageViewA, radius=50, и нарисовать в другой imageViewB (frame{0,0,100,100}); оригинальный эффект изображения, как это:
и используйте код ниже, чтобы обрезать:
UIGraphicsBeginImageContext(self.frame.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGFloat height = self.bounds.size.height;
CGContextTranslateCTM(ctx, 0.0, height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextAddArc(ctx, self.frame.size.width/2, self.frame.size.height/2, 50, 0, 2*M_PI, 0);
CGContextClosePath(ctx);
CGContextSaveGState(ctx);
CGContextClip(ctx);
CGContextDrawImage(ctx, CGRectMake(0,0,self.frame.size.width, self.frame.size.height), image.CGImage);
CGContextRestoreGState(ctx);
CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
UIImage *newImage = [UIImage imageWithCGImage:imageRef];
NSString *headerPath = [NSString stringWithFormat:@"%@/header.png",HomeDirectory];
NSData *imageData = UIImageJPEGRepresentation(newImage, 1.0);
if([imageData writeToFile:headerPath atomically:YES]){
imageViewB.image = [UIImage imageWithContentsOfFile:headerPath];
}
клип эффект изображения, как это:
Мне нужен только круговой вид, но у отображения эффекта клипа этот imageViewB имеет пустое пространство. Как правильно обрезать это изображение? Спасибо!
4 ответа
imageViewB.layer.cornerRadius = 50.0;
imageViewB.layer.masksToBounds = YES;
JPEG не поддерживает прозрачность. использование UIImagePNGRepresentation
вместо UIImageJPEGRepresentation
и вы получите желаемый результат.
NSData *imageData = UIImagePNGRepresentation(newImage);
if([imageData writeToFile:headerPath atomically:YES]){
imageViewB.image = [UIImage imageWithContentsOfFile:headerPath];
}
Прежде чем нарисовать изображение:
CGContextSetBlendMode(ctx, kCGBlendModeClear);
CGContextFillRect(ctx, self.bounds);
CGContextSetBlendMode(ctx, kCGBlendModeNormal);
Просто используйте маскировку для этого. Этот код поможет вам маскировать изображения.
+ (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 masked = CGImageCreateWithMask([image CGImage], mask);
UIImage *uiMasked = [UIImage imageWithCGImage:masked];
CFRelease(mask);
CFRelease(masked);
return uiMasked;
}
Эта статья может помочь вам http://www.abdus.me/ios-programming-tips/how-to-mask-image-in-ios-an-image-masking-technique/
После маскировки вам нужно создать imageView с этим замаскированным изображением, а затем передать его в другой imageView.