2009-07-16 68 views
2

我有一个300 x 400像素PNG-24 alpha通道。大约140kb。我想掩盖一些部分,所以我创建了另一个300 x 400图像作为PNG-24,但只有黑色,灰色和白色,没有alpha通道。为什么我的图像遮罩会使图像变黑,遮罩是白色的?

奇怪的是:那里的面具是黑色的,图像只是保持原来的。没有透明度。但是,如果面膜是白色的,图像变黑只是黑色。没有透明度。

它在50 x 50像素的非常小的图像上部分工作。任何想法这个功能可能是错误的?

+ (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 theImage = image.CGImage; 
    CGImageRef masked = CGImageCreateWithMask(theImage, mask); 
    return [UIImage imageWithCGImage:masked]; 
} 

我的背景是橙色的,所以这种颜色应该透过。保存图像的UIImageView被设置为clearColor/transparency和opaque = NO。

回答

0

我想你的代码是from here。有此评论:

我已经提高了代码,以便它可以 正确地掩盖没有 alpha通道图像。

所以,如果它不适合你,也许你的图片没有alpha通道。

+0

谢谢!我想我的愚蠢的图形应用程序不会创建一个alpha通道,如果我没有透明像素,即使我保存时检查“透明”。这是问题! – Thanks 2009-07-16 09:41:23

0

小心 - 代码泄露!直到在循环中运行此方法时,我才注意到它。确保在返回图像之前拨打CGImageRelease(mask)CGImageRelease(masked)

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

    UIImage *img = [UIImage imageWithCGImage:masked]; 

    //otherwise we will leak 
    CGImageRelease(mask); 
    CGImageRelease(masked); 

    return img; 
}