2010-05-05 13 views
12

मास्किंग मैं एक ऐसे ऐप पर काम कर रहा हूं जो सीमाओं या आयताकार UIImage को बदल सकता है। सीमाएं अलग-अलग होंगी, लेकिन ऐसा लगता है कि यूआईएममेज कैंची के साथ काटा गया था, या इससे प्रभावित कुछ ऐसा था।एक UIImage

ऐसा करने का सबसे अच्छा तरीका क्या है?

मेरा पहला विचार पारदर्शी पीएनजी का एक गुच्छा सही सीमा प्रभाव के साथ प्रस्तुत करना है, और फिर किसी भी तरह से इसे अपने UIImage के लिए मुखौटा के रूप में उपयोग करना है। क्या यह सही रास्ता है? या ऐसा करने के लिए एक और अधिक लचीला प्रोग्रामेटिक तरीका है?

उत्तर

24

यहाँ कोर ग्राफिक्स कॉल कि आप छवि मुखौटा का उपयोग कर सकते हैं:

//Mask Image 
UIImage *inputImage = [UIImage imageNamed:@"inputImage.png"]; 
CGImageRef maskRef = [UIImage imageNamed:@"mask.png"].CGImage; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 

CGImageRef masked = CGImageCreateWithMask([inputImage CGImage], mask); 
CGImageRelease(mask); 

UIImage *maskedImage = [UIImage imageWithCGImage:masked]; 

CGImageRelease(masked); 
+0

धन्यवाद! यह सोचने के लिए सोच रहा था कि यह कैसे करें। वंशावली के लिए, आपके पहले UIImage आवंटन में एक छोटा टाइपो है: अपने दूसरे की तरह 'imageNamed' कहना चाहिए। – dooleyo

+0

'imageWithCGImage: 'to' imageWIthCGImage: स्केल: ओरिएंटेशन: ' – jowie

+0

http://stackoverflow.com/a/5757417 – danh

3

हाँ, यह बहुत कुछ है जो आपको करने की ज़रूरत है। कोर ग्राफिक्स का उपयोग करना सबसे अच्छा तरीका है; क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड में article describing how to mask images with other images है। आप अपने CGImage संपत्ति के माध्यम से एक CGImageRef (जो इन कोर ग्राफिक्स तरीकों का उपयोग) एक UIImage वस्तु से प्राप्त है, और फिर UIImage वर्ग विधि +imageWithCGImage: का उपयोग कर अपने को बदल (नकाबपोश) CGImageRef से वापस एक UIImage मिल सकती है।

+1

CGImage अशक्त अगर यह एक CIImage से बनाया गया था इसलिए सावधान रहना है। – Aggressor

6

आपको लगता है कि के लिए छवि मास्किंग की जरूरत है, मैं एक tutorial on how to use it लिखा था और कैसे मैं अपने खुद के आवेदन में यह प्रयोग किया है।

निम्नलिखित उदाहरण कोड आपको प्रारंभ करने में मदद कर सकता है, इसे मूल छवि और मास्क छवि को इनपुट के रूप में चाहिए और यह आउटपुट के रूप में मुखौटा छवि लौटाता है।

- (UIImage*) maskImage:(UIImage *) image withMask:(UIImage *) mask 
{ 
    CGImageRef imageReference = image.CGImage; 
    CGImageRef maskReference = mask.CGImage; 

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), 
              CGImageGetHeight(maskReference), 
              CGImageGetBitsPerComponent(maskReference), 
              CGImageGetBitsPerPixel(maskReference), 
              CGImageGetBytesPerRow(maskReference), 
              CGImageGetDataProvider(maskReference), 
              NULL, // Decode is null 
              YES // Should interpolate 
              ); 

    CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask); 
    CGImageRelease(imageMask); 

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; 
    CGImageRelease(maskedReference); 

    return maskedImage; 
} 
+0

के समान ही मैं इसे देख रहा हूं, और दुर्भाग्य से मैं इसे काम पर नहीं ला सकता । मैंने छवि को दूसरे पैरामीटर में बी और डब्ल्यू छवि की तुलना में पहले पैरामीटर में रखा, दोनों एक ही आकार में, और आउटपुट बिल्कुल पहली छवि के समान ही है। – jowie

+0

आपका ट्यूटोरियल लिंक टूटा हुआ है। – capikaw

0

पथ के साथ ऐसा करने का एक और तरीका है। मैंने कोड पोस्ट किया है जो इसे एक सर्कल के साथ करता है और आसानी से किसी भी बंद पथ के साथ काम करने के लिए संपादित किया जा सकता है। एक UIImage से

How to crop UIImage on oval shape or circle shape?