2010-07-21 16 views
1

J'ai des images de masques sans canal alpha, noir et blanc pur avec un polygone noir au centre entouré de blanc.Le masquage UIImage donne un fond noir sur l'iPhone (et non sur le simulateur)

J'ai l'image de png que j'aimerais masquer. le png a un canal alpha. en utilisant la méthode ci-dessous: ok sur le simulateur, mais le fond est noir sur l'appareil ... une idée pour résoudre ce problème?

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

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

//CGImageRelease(mask); 
//CGImageRelease(maskRef); 
return [UIImage imageWithCGImage:masked]; 

}

Répondre

2

Problème résolu: la solution est: l'image à masquer DOIT être créée avec un canal alpha. Le canal alpha peut ne pas être créé à partir du code.

+0

Je suis confronté au même problème. pourriez-vous poster un échantillon de code sur la façon de créer le canal alpha? – lxcid

+0

Merci Tibi. Pour moi, il était également important que maskImage possède un canal alpha. Donc, depuis iOS7 BOTH images, l'image à masquer et le masque lui-même doit avoir un canal alpha. – sust86

0

Même ici avec le code suivant

- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage { 
CGImageRef maskRef = maskImage.CGImage; 
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 

CGImageRef sourceImage = [image CGImage]; 
CGImageRef imageWithAlpha = sourceImage; 
//add alpha channel for images that don't have one (ie GIF, JPEG, etc...) 
//this however has a computational cost 
if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) { 
    imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage); 
} 

CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); 
//const float colorMasking[6] = { 100,100, 100, 250,250, 250}; 
//CGImageRef maskedImageRef = CGImageCreateWithMaskingColors(temp.CGImage, colorMasking); 
CGImageRelease(mask); 

//release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel 
if (sourceImage != imageWithAlpha) { 
    CGImageRelease(imageWithAlpha); 
} 

UIImage* retImage = [UIImage imageWithCGImage:masked]; 
CGImageRelease(masked); 

return retImage; 

}

CGImageRef CopyImageAndAddAlphaChannel(CGImageRef sourceImage) { 
CGImageRef retVal = NULL; 

size_t width = CGImageGetWidth(sourceImage); 
size_t height = CGImageGetHeight(sourceImage); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, 
                 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst); 

if (offscreenContext != NULL) { 
    CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage); 

    retVal = CGBitmapContextCreateImage(offscreenContext); 
    CGContextRelease(offscreenContext); 
} 

CGColorSpaceRelease(colorSpace); 

return retVal; 

}

Works parfaitement sur simulateur, mais pas sur l'appareil iPhone: toutes les images sont ma sked mais avec un fond noir.

+0

Je vous ai utilisé votre code et je pense que le problème est la ligne "CGImageGetAlphaInfo (sourceImage) == kCGImageAlphaNone". Dans mon cas c'était toujours faux, forçant pas !! pour ajouter un canal alpha. L'ajout de la couche alpha a toujours fonctionné. – AlexVogel