掩盖UIImage

时间:2010-05-05 21:00:28

标签: cocoa-touch uiimage core-graphics transparent mask

我正在开发一款可以更改边框或矩形UIImage的应用。边框会有所不同,但看起来UIImage会被用剪刀剪掉,或者会产生影响。

这样做的最佳方式是什么?

我的第一个想法是准备一堆透明的PNG,它具有我正在寻找的正确边框效果,然后以某种方式将其用作我的UIImage的面具。这是正确的道路吗?或者是否有更灵活的编程方式来做到这一点?

4 个答案:

答案 0 :(得分:25)

以下是可用于屏蔽图像的Core Graphics调用:

//Mask Image
UIImage *inputImage = [UIImage imageNamed:@"inputImage.png"];
CGImageRef maskRef = [UIImage imageNamed:@"mask.png"].CGImage; 

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

CGImageRef masked = CGImageCreateWithMask([inputImage CGImage], mask);
CGImageRelease(mask);

UIImage *maskedImage = [UIImage imageWithCGImage:masked];

CGImageRelease(masked);

答案 1 :(得分:6)

你需要图像屏蔽,我写了tutorial on how to use it以及我如何在我自己的应用程序中使用它。

以下示例代码应该可以帮助您入门,它需要原始图像和掩码图像作为输入,并将屏蔽图像作为输出返回。

- (UIImage*) maskImage:(UIImage *) image withMask:(UIImage *) mask
{
    CGImageRef imageReference = image.CGImage;
    CGImageRef maskReference = mask.CGImage;

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference),
                                             CGImageGetHeight(maskReference),
                                             CGImageGetBitsPerComponent(maskReference),
                                             CGImageGetBitsPerPixel(maskReference),
                                             CGImageGetBytesPerRow(maskReference),
                                             CGImageGetDataProvider(maskReference),
                                             NULL, // Decode is null
                                             YES // Should interpolate
                                             );

    CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask);
    CGImageRelease(imageMask);

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference];
    CGImageRelease(maskedReference);

    return maskedImage;
}

答案 2 :(得分:3)

是的,这几乎是你需要做的。最好的方法是使用Core Graphics; Quartz 2D Programming指南有一个article describing how to mask images with other images。您可以通过CGImageRef属性从UIImage对象获取CGImage(这些核心图形方法使用的),然后从您的更改(屏蔽)中获取UIImage CGImageRef使用UIImage类方法+imageWithCGImage:

答案 3 :(得分:0)

还有另一种方法可以通过路径执行此操作。我发布的代码用圆圈表示,可以轻松编辑以适应任何封闭的路径。

How to crop UIImage on oval shape or circle shape?