14

मैं एक छवि मास्क बनाने की कोशिश कर रहा हूं जो दो मौजूदा छवियों के संयुक्त से है।CGImageMaskCreate के साथ मास्क बनाना सभी ब्लैक (आईफोन)

UIImage * BaseTextureImage = [UIImage imageNamed:@"background.png"]; 
UIImage * MaskImage = [UIImage imageNamed:@"my_mask.jpg"]; 
UIImage * ShapesBase = [UIImage imageNamed:@"largerimage.jpg"]; 
UIImage * MaskImageFull; 

CGSize finalSize = CGSizeMake(480.0, 320.0); 
UIGraphicsBeginImageContext(finalSize); 
[ShapesBase drawInRect:CGRectMake(0, 0, 480, 320)]; 
[MaskImage drawInRect:CGRectMake(150, 50, 250, 250)]; 
MaskImageFull = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

मैं यह कर सकते हैं उत्पादन इस UIImage (MaskImageFull:

सबसे पहले मैं समग्र एक छोटे से छवि है कि मास्किंग छवि है के होते हैं जो, और एक बड़ी छवि जो पृष्ठभूमि के रूप में एक ही आकार है बनाने के साथ शुरू) और यह सही दिखता है, यह एक पूर्ण आकार का पृष्ठभूमि आकार है और यह स्क्रीन पर सही जगह पर, मेरे मुखौटा ऑब्जेक्ट के साथ एक सफेद पृष्ठभूमि है।

मैं तो इस के माध्यम से MaskImageFull UIImage पारित:

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

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 
UIImage* retImage= [UIImage imageWithCGImage:masked]; 

समस्या यह है कि retImage सभी काले है। यदि मैं मुखौटा के रूप में एक पूर्व निर्मित यूआईएममेज भेजता हूं तो यह ठीक काम करता है, यह तब होता है जब मैं इसे कई छवियों से बनाने की कोशिश करता हूं जो टूट जाता है।

मैंने सोचा कि यह एक रंगीन चीज़ थी लेकिन इसे ठीक नहीं कर सका। किसी भी प्रकार की मदद की बेहद सराहना की जाती है!

उत्तर

19

मैंने CGImageCreateWithMask के साथ एक ही चीज़ की कोशिश की, और एक ही परिणाम मिला।

CGContextRef mainViewContentContext; 
CGColorSpaceRef colorSpace; 

colorSpace = CGColorSpaceCreateDeviceRGB(); 

// create a bitmap graphics context the size of the image 
mainViewContentContext = CGBitmapContextCreate (NULL, targetSize.width, targetSize.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 

// free the rgb colorspace 
CGColorSpaceRelease(colorSpace);  

if (mainViewContentContext==NULL) 
    return NULL; 

CGImageRef maskImage = [[UIImage imageNamed:@"mask.png"] CGImage]; 
CGContextClipToMask(mainViewContentContext, CGRectMake(0, 0, targetSize.width, targetSize.height), maskImage); 
CGContextDrawImage(mainViewContentContext, CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledWidth, scaledHeight), self.CGImage); 


// Create CGImageRef of the main view bitmap content, and then 
// release that bitmap context 
CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext); 
CGContextRelease(mainViewContentContext); 

// convert the finished resized image to a UIImage 
UIImage *theImage = [UIImage imageWithCGImage:mainViewContentBitmapContext]; 
// image is retained by the property setting above, so we can 
// release the original 
CGImageRelease(mainViewContentBitmapContext); 

// return the image 
return theImage; 
+1

मुझे बहुत मदद मिली। क्या आप इसे पूरा करने के लिए फ़ंक्शन का हेडर और पाद लेख जोड़ सकते हैं? – Eden

+0

बिल्कुल थंबनेलपॉइंट.एक्स क्या है ?? @catlan –

+0

@ Reza.Ab क्षमा करें मुझे याद नहीं है। स्केल * 9 साल बाद अजीब लग रहा है। मुझे लगता है कि ज्यादातर मामलों में मास्क रेक्ट और छवि रेक्ट एक जैसा होना चाहिए। कृपया इसे आज़माएं और हमें बताएं कि आपको क्या मिल रहा है, – catlan

1

छवि नकाबपोश जा करने के लिए एक अल्फा चैनल के साथ बनाया जाना चाहिए: समाधान मैंने पाया बजाय CGContextClipToMask उपयोग करने के लिए किया गया था। अल्फा चैनल कोड से नहीं बनाया जा सकता है।

4
- (UIImage*) maskImage:(UIImage *)image { 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    UIImage *maskImage = [UIImage imageNamed:@"MaskFinal.png"]; 
    CGImageRef maskImageRef = [maskImage CGImage]; 

    // create a bitmap graphics context the size of the image 
    CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 


    if (mainViewContentContext==NULL) 
     return NULL; 

    CGFloat ratio = 0; 

    ratio = maskImage.size.width/ image.size.width; 

    if(ratio * image.size.height < maskImage.size.height) { 
     ratio = maskImage.size.height/ image.size.height; 
    } 

    CGRect rect1 = {{0, 0}, {maskImage.size.width, maskImage.size.height}}; 
    CGRect rect2 = {{-((image.size.width*ratio)-maskImage.size.width)/2 , -((image.size.height*ratio)-maskImage.size.height)/2}, {image.size.width*ratio, image.size.height*ratio}}; 


    CGContextClipToMask(mainViewContentContext, rect1, maskImageRef); 
    CGContextDrawImage(mainViewContentContext, rect2, image.CGImage); 


    // Create CGImageRef of the main view bitmap content, and then 
    // release that bitmap context 
    CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext); 
    CGContextRelease(mainViewContentContext); 

    UIImage *theImage = [UIImage imageWithCGImage:newImage]; 

    CGImageRelease(newImage); 

    // return the image 
    return theImage; 
} 
+0

वास्तव में काम नहीं करता है ... –

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

  • कोई संबंधित समस्या नहीं^_^