2010-09-04 38 views
0

我從以下網址獲取了示例代碼:how to mask an image以屏蔽圖像。屏蔽UIImage時出現問題

代碼是可以正常使用的iPhone模擬器,但不正確地工作在iPhone 4上的模擬器(高清晰度的圖像加載時的...)

這裏是我的代碼和屏蔽功能:

- (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; 
} 

在iPhone 4模擬器上加載[email protected][email protected],然後裁剪生成的maskedImage。

任何想法我做錯了什麼?

回答

0

我的猜測是不信任的UIImage交付highrez格式CGImageRefs等,我認爲你需要做手工。

+0

感謝。您是否有任何示例代碼將對標準和高分辨率圖像執行遮罩工作? – Joshua 2010-09-04 19:37:23

1

使用此方法,而不是評論克里斯上述

- (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; 
}