2010-09-04 12 views
0

J'ai pris un exemple de code à l'adresse suivante: how to mask an image afin de masquer une image.Problème lors du masquage UIImage

Le code fonctionne parfaitement sur le simulateur iPhone, mais ne fonctionne pas correctement sur iPhone 4 simulateur (c'est quand des images haute résolution sont chargés ...)

Voici mon code et la fonction de masque:

- (void)someMethod { 

    UIImage* image = [UIImage imageNamed:@"image.png"]; // [email protected] is loaded for high-res device 

    UIImage* mask = [UIImage imageNamed:@"mask.png"]; // [email protected] is loaded for high-res device 

    UIImage* maskedImage = [self maskImage:image withMask:mask]; 

    // ... Some code here displaying maskedImage 

} 

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

    UIImage* maskedImage = nil; 

    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); 
    maskedImage = [UIImage imageWithCGImage:masked]; 

    return maskedImage; 
} 

Sur le simulateur de l'iPhone 4, les images [email protected] et [email protected] sont chargées, puis l'image masquée résultante est rognée.

Une idée de ce que je fais mal?

Répondre

0

Je pense que je ne ferais pas confiance à UIImage pour livrer le format highrez à CGImageRefs etc. Je pense que vous devrez le faire manuellement.

+0

Merci Chris le commentaire. Avez-vous un exemple de code qui fera le travail de masquage pour les images standard et haute résolution? – Joshua

1

Utilisez cette méthode plutôt qu'au-dessus

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

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    //UIImage *maskImage = [UIImage imageNamed:@"mask.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; 
}