2013-11-07 3 views
3

У меня есть изображениеViewA (frame {0,0,320,200}) в моем приложении, и я хочу обрезать круг с центром imageViewA, радиус = 50 и рисовать в другое изображениеViewB (frame { 0,0,100,100}); первоначальный эффект изображения, как это:Используйте CGContextClip для обрезания круга с изображением

enter image description here

и использовать ниже код для клипа:

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]; 
} 

клип эффект изображения, как это:

enter image description here

мне нужно только круг, но эффект эффекта клипа показывает, что изображениеViewB имеет пробел. Как правильно закрепить это изображение? Спасибо!

ответ

0

Просто используйте маскирующие для этих целей Этот код поможет замаскировать изображения

+ (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 с этим замаскированного изображения а затем пересмотреть его в другое изображение.

+0

Можете ли вы сказать мне вашу электронную почту? – Roby

1

JPEG не поддерживает прозрачность. Используйте UIImagePNGRepresentation вместо UIImageJPEGRepresentation, и вы получите нужный результат.

NSData *imageData = UIImagePNGRepresentation(newImage); 
if([imageData writeToFile:headerPath atomically:YES]){ 
    imageViewB.image = [UIImage imageWithContentsOfFile:headerPath]; 
} 
+0

Да! Используйте UIImagePNGRпредставление вместо UIImageJPEGRepresentation, эффект правильный. Но обрезанный круг не заполняет imageViewB. И я установил imageViewB.contentMode = UIViewContentModeScaleAspectFill. Зачем? – Roby

+0

@ user2082720 кто «сам» в тебе код? imageViewA? Я думаю, что вы не используете правильный размер для своей цели. – Emmanuel

6
imageViewB.layer.cornerRadius = 50.0; 
imageViewB.layer.masksToBounds = YES; 
0

Перед тем, как рисовать изображения:

CGContextSetBlendMode(ctx, kCGBlendModeClear); 
CGContextFillRect(ctx, self.bounds); 
CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
Смежные вопросы