2012-03-13 16 views

उत्तर

3

किसी छवि को घटाने का क्या अर्थ है? दिए गए नमूना छवि में से एक लाल ऑपरेशन दिखाता है। आइए हम कहें कि इमेज बी से इमेज को घटाए जाने का मतलब बी में प्रत्येक पिक्सेल को सेट करना है जो एक पिक्सेल को पारदर्शी में छेड़छाड़ करता है। घटाव करने के लिए, हम वास्तव में क्या कर रहे हैं छवि छवि के विपरीत में छवि बी मास्किंग है। इसलिए, छवि के अल्फा चैनल से एक छवि मास्क बनाने के लिए एक अच्छा दृष्टिकोण होगा, फिर इसे बी पर लागू करें। मुखौटा बनाने के लिए आप ऐसा कुछ करेंगे:

// get access to the image bytes 
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); 

// create a buffer to hold the mask values 
size_t width = CGImageGetWidth(image.CGImage); 
size_t height = CGImageGetHeight(image.CGImage);  
uint8_t *maskData = malloc(width * height); 

// iterate over the pixel data, reading the alpha value 
uint8_t *alpha = (uint8_t *)CFDataGetBytePtr(pixelData) + 3; 
uint8_t *mask = maskData; 
for (int y = 0; y < height; y++) { 
    for (int x = 0; x < width; x++) { 
     *mask = *alpha; 
     mask++;  
     alpha += 4; // skip to the next pixel 
    } 
} 

// create the mask image from the buffer 
CGDataProviderRef maskProvider = CGDataProviderCreateWithData(NULL, maskData, width * height, NULL); 
CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, maskProvider, NULL, false); 

// cleanup 
CFRelease(pixelData); 
CFRelease(maskProvider); 
free(maskData); 

whew। फिर, छवि बी मुखौटा करने के लिए, आपको बस इतना करना है:

CGImageRef subtractedImage = CGImageCreateWithMask(b.CGImage, maskImage); 

हे प्रतिष्ठा।

+0

अच्छा उदाहरण - यह मेरे लिए काम है। धन्यवाद! –

3

उन परिणामों को प्राप्त करने के लिए, पहली छवि को खींचते समय दूसरी छवि को मुखौटा के रूप में उपयोग करें। इस तरह के चित्र के लिए, आपको कोर ग्राफिक्स, ए.के.ए. क्वार्ट्ज 2 डी का उपयोग करने की आवश्यकता होगी। क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड में Bitmap Images and Image Masks नामक एक अनुभाग है जो आपको जो कुछ जानने की आवश्यकता है उसे बताना चाहिए।

आप UIImage ऑब्जेक्ट्स के बारे में पूछ रहे हैं, लेकिन कोर ग्राफिक्स का उपयोग करने के लिए आपको CGImages की आवश्यकता होगी। यह कोई समस्या नहीं है - UIImage CGImage प्रॉपर्टी प्रदान करता है जो आपको आसानी से आवश्यक डेटा प्राप्त करने देता है।

13

मेरा मानना ​​है कि आप kCGBlendModeDestinationOut मिश्रण मोड का उपयोग करके इसे पूरा कर सकते हैं। एक नया संदर्भ बनाएं, अपनी पृष्ठभूमि छवि खींचें, फिर इस मिश्रण मोड के साथ अग्रभूमि छवि बनाएं।

UIGraphicsBeginImageContextWithOptions(sourceImage.size, NO, sourceImage.scale) 
[sourceImage drawAtPoint:CGPointZero]; 
[maskImage drawAtPoint:CGPointZero blendMode:kCGBlendModeDestinationOut alpha:1.0f]; 
UIImage *result = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext(); 
+0

+1: इसके लिए जाने की सलाह देंगे। स्वीकृत उत्तर से अधिक स्वच्छ और सरल। – sjwarner

+0

तो मैं, बहुत चिकना होगा। – Tark

+1

हाँ, यह स्वीकार्य उत्तर होना चाहिए। –

0

केविन Ballard के समाधान मेरे लिए काम किया! स्विफ्ट 3.x:

func subtract(source: UIImage, mask: UIImage) -> UIImage? { 
    UIGraphicsBeginImageContextWithOptions(source.size, false, source.scale) 
    source.draw(at: CGPoint.zero) 
    mask.draw(at: CGPoint.zero, blendMode: .destinationOut, alpha: 1.0) 
    let result = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return result 
} 
संबंधित मुद्दे