2012-05-29 38 views
9

Tôi mới sử dụng Quartz. Tôi có 2 hình ảnh, một nền và một mặt nạ với hình dạng bỏ đi mà tôi muốn đặt trên nền để cắt ra một phần. Các hình ảnh kết quả nên được hình dạng của cutout. Đây là mặt nạ của tôi (hình ở giữa là 0 alpha):CGContextClipToMask trả về ảnh trống

image mask

Và đây là mã của tôi:

UIView *canvas = [[[sender superview] subviews] objectAtIndex:0]; 

UIGraphicsBeginImageContext(canvas.bounds.size); 
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef cgContext = CGBitmapContextCreate(NULL, canvas.bounds.size.width, canvas.bounds.size.height, 8, 0, colourSpace, kCGImageAlphaPremultipliedLast); 
CGColorSpaceRelease(colourSpace); 

CGImageRef maskImage = [[UIImage imageNamed:@"Mask.png"] CGImage]; 
CGContextClipToMask(cgContext, CGRectMake(0, 0, canvas.frame.size.width, canvas.frame.size.height), maskImage); 

CGImageRef maskedImageRef = CGBitmapContextCreateImage(cgContext); 
CGContextRelease(cgContext); 

UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef]; 
UIGraphicsEndImageContext(); 

[button setBackgroundImage:maskedImage forState:UIControlStateNormal]; 

Trừ gì xuất hiện ... Bất cứ ý tưởng nơi tôi sẽ sai rồi? Cảm ơn nhiều.

+0

Bạn không dường như rút ra bất cứ điều gì. Bạn cắt ra không có gì từ không có gì, và không có gì. Như mong đợi. Giữa việc cắt mặt nạ và tạo hình ảnh, bạn nên vẽ một thứ gì đó. –

Trả lời

10

Sau khi bạn cắt bối cảnh bằng mặt nạ, bạn thực sự nên vẽ thứ gì đó trên ngữ cảnh đó.

Bên cạnh đó:

  • bạn nên sử dụng UIGraphicsBeginImageContextWithOptions để hỗ trợ yếu tố quy mô.
  • bạn đang tạo hai ngữ cảnh, một với UIGraphicsBeginImageContext và một với CGBitmapContextCreate. Một là đủ :)
  • bạn nên "lật" alpha mặt nạ của bạn, bởi vì theo tài liệu The source samples of mask determine which points of the clipping area are changed. Nói cách khác trong suốt sẽ trở nên trong suốt

Simple mã ví dụ, nơi tôi cắt hình ảnh bên trong IMAGExem và sau đó đặt nó trở lại:

UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, NO, 0.0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextTranslateCTM(context, 0.0, self.imageView.frame.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

CGImageRef maskImage = [[UIImage imageNamed:@"mask.png"] CGImage]; 
CGContextClipToMask(context, self.imageView.bounds, maskImage); 

CGContextTranslateCTM(context, 0.0, self.imageView.frame.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

[[self.imageView image] drawInRect:self.imageView.bounds]; 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

self.imageView.image = image; 

Ví dụ sử dụng CGImageCreateWithMask:

UIImage *image = [UIImage imageNamed:@"image"]; 

CGImageRef originalMask = [UIImage imageNamed:@"mask"].CGImage; 
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(originalMask), 
            CGImageGetHeight(originalMask), 
            CGImageGetBitsPerComponent(originalMask), 
            CGImageGetBitsPerPixel(originalMask), 
            CGImageGetBytesPerRow(originalMask), 
            CGImageGetDataProvider(originalMask), nil, YES); 

CGImageRef maskedImageRef = CGImageCreateWithMask(image.CGImage, mask); 

UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef scale:image.scale orientation:image.imageOrientation]; 

CGImageRelease(mask); 
CGImageRelease(maskedImageRef); 
+0

Tôi hiểu, cảm ơn! Chỉ là một vài câu hỏi. Tại sao bạn cần gọi TranslateCTM hai lần? Ngoài ra, tôi nhận được hiệu ứng nghịch đảo - phần alpha 0 của mặt nạ đang được cắt ra, trong khi phần màu đen của hình ảnh đang được vẽ. Theo các tài liệu, tôi cần che giấu hình ảnh bằng một hình ảnh, không phải mặt nạ, bằng cách sử dụng CGImageCreateWithMask nhưng tôi sử dụng nó ở đâu? – Smikey

+0

UIKit và CGGraphics có các hệ tọa độ khác nhau, vì vậy chúng ta cần dịch ma trận. "Phần alpha 0 của mặt nạ đang bị cắt" - đó chính xác là tài liệu gì cho 'CGContextClipToMask' và' CGImageCreateWithMask' cho bạn biết. Ví dụ về 'CGImageCreateWithMask' được thêm vào. –

+0

Thật không may là các giải pháp ở đây hoạt động ngay bây giờ trong ios 11 như tôi đã thử nghiệm, tôi đã cố gắng che giấu hai UIImages và sử dụng cả hai phương pháp này. người đầu tiên ép hình ảnh sau khi cắt và hình thứ hai trả về {0.0} @Evgeny Shurakov –

Các vấn đề liên quan