2012-05-29 22 views
9

मैं क्वार्ट्ज के लिए नया हूं। मेरे पास 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

मुझे लगता है, धन्यवाद! बस कुछ सवाल। आपको अनुवादकटीएम को दो बार कॉल करने की आवश्यकता क्यों है? इसके अलावा, मुझे उलटा प्रभाव मिल रहा है - मुखौटा के अल्फा 0 भाग काटा जा रहा है, जबकि छवि का काला हिस्सा खींचा जा रहा है। दस्तावेज़ों के मुताबिक, मुझे CGImageCreateWithMask का उपयोग कर एक छवि के साथ छवि को मुखौटा करने की आवश्यकता है, लेकिन मैं इसका उपयोग कहां करूं? – Smikey

+0

UIKit और CGGraphics में अलग समन्वय सिस्टम हैं, इसलिए हमें मैट्रिक्स का अनुवाद करने की आवश्यकता है। "मास्क का अल्फा 0 हिस्सा काटा जा रहा है" - यह वास्तव में 'CGContextClipToMask' और' CGImageCreateWithMask' के लिए प्रलेखन आपको बताता है। 'CGImageCreateWithMask' का उदाहरण जोड़ा गया है। –

+0

दुर्भाग्यवश यहां समाधानों में से कोई भी आईओएस 11 में काम नहीं करता है, मैंने परीक्षण किया है, मैंने दो यूआईएममेज को मास्क करने की कोशिश की और इन दोनों विधियों का उपयोग किया। पहला क्लिपिंग के बाद छवि को निचोड़ता है और दूसरा एक {0.0} @ एवेगेनी शुराकोव देता है –

संबंधित मुद्दे