2010-05-05 106 views
12

我工作的一个应用程序,可以改变边界或矩形的UIImage。边界会有所不同,但看起来UIImage会被剪刀剪掉,或者会影响到它。掩盖一个UIImage

这样做的最好方法是什么?

我首先想到的是预习一堆透明的PNG图像与正确的边框效果我正在寻找,然后以某种方式使用它作为我的UIImage口罩。这是正确的道路吗?还是有更灵活的编程方式来做到这一点?

回答

24

这里是核芯显卡调用你可以用它来掩盖图像:

//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); 
+0

谢谢!想知道如何做到这一点。对于后代,你的第一个UIImage alloc有一个小的错字:应该像第二个那样说'imageNamed'。 – dooleyo 2013-08-07 20:25:25

+0

需要更新'imageWithCGImage:''到imageWIthCGImage:规模:定位:' – jowie 2015-07-09 16:59:16

+0

非常相似,http://stackoverflow.com/a/5757417 – danh 2016-05-05 02:22:40

3

是的,这是相当多的,你需要做什么。最好的方法是使用Core Graphics;石英2D编程指南有一个article describing how to mask images with other images。您可以通过获取其CGImage属性CGImageRef(这些核芯显卡方法使用)从UIImage对象,然后使用UIImage类方法+imageWithCGImage:从改变(屏蔽)CGImageRef得到UIImage回来。

+1

CGImage为空。 – Aggressor 2014-09-26 01:41:02

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; 
} 
+0

我一直在寻找在这个,可惜我不能让它开始工作。我将图像放在第一个参数中,而不是第二个参数中的B&W图像,尺寸相同,输出与第一张图像完全相同。 – jowie 2015-07-09 17:27:29

+0

您的教程链接已损坏。 – capikaw 2016-09-09 17:54:53

0

还有一种方法可以做到这一点与路径。我已经发布了一个代码,它可以用一个圆圈来完成,并且可以很容易地编辑来处理任何封闭的路径。如果它是从一个CIImage创建的,所以要小心从一个UIImage

How to crop UIImage on oval shape or circle shape?