2012-05-29 261 views
9

我是Quartz的新手。我有2張圖片,一張背景和一張剪裁形狀的面具,我想將它們放在背景上以便剪出一個部分。由此產生的圖像應該是切口的形狀。這是我的面具(中間的形狀爲0阿爾法):CGContextClipToMask返回空白圖像

image mask

這是我的代碼:

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

除非出現什麼...任何想法,我要去錯誤?非常感謝。

+0

你不似乎畫了任何東西。你什麼也沒有,沒有任何東西。如預期。在裁剪之間進行蒙版和創建圖像之間,你應該畫一些東西。 –

回答

10

在您將上下文與模板剪輯後,您應該在該上下文中繪製一些內容。

除此之外:

  • 你應該使用UIGraphicsBeginImageContextWithOptions支持比例因子。
  • 您正在創建兩個上下文,一個是UIGraphicsBeginImageContext,另一個是CGBitmapContextCreate。一個是足夠的:)
  • 你應該「翻轉」你的面具的阿爾法,因爲根據文檔The source samples of mask determine which points of the clipping area are changed。透明換句話說將會變得透明

簡單的示例代碼,在那裏我的剪輯圖像內的ImageView,然後將其設置回:

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; 

示例使用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

我明白了,謝謝!只是幾個問題。你爲什麼需要撥打TranslateCTM兩次?另外,我得到了相反的效果 - 遮罩的alpha 0部分被剪切掉,而圖像的黑色部分正在被繪製。根據文檔,我需要通過使用CGImageCreateWithMask來掩蓋圖像,而不是掩碼,但我在哪裏使用它? – Smikey

+0

UIKit和CGGraphics有不同的座標系,所以我們需要翻譯矩陣。 「掩碼的alpha 0部分正在被剪切掉」 - 這正是'CGContextClipToMask'和'CGImageCreateWithMask'的文檔告訴你的。添加了「CGImageCreateWithMask」的示例。 –

+0

不幸的是,這裏的解決方案現在在我測試的ios 11上工作,我試圖掩蓋兩個UIImages並使用這兩種方法。第一個裁剪之後擠壓圖像,第二個返回{0.0} @Evgeny Shurakov –