12

我正在开发一个可以更改边框或矩形 UIImage 的应用程序。边框会有所不同,但看起来 UIImage 是用剪刀剪掉的,或者类似的东西。

做这个的最好方式是什么?

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

4

4 回答 4

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);
于 2011-01-13T23:35:03.933 回答
6

你需要图像遮罩,我写了一篇关于如何使用它以及我如何在我自己的应用程序中使用它的教程。

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

- (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;
}
于 2012-11-08T10:22:51.613 回答
3

是的,这几乎就是你需要做的。最好的方法是使用 Core Graphics;Quartz 2D Programming guide 有一篇文章描述了如何用其他图像屏蔽图像。您可以通过对象的属性从对象中获取CGImageRef(这些 Core Graphics 方法使用的),然后使用类方法从更改的(屏蔽的)中获取返回。UIImageCGImageUIImageCGImageRefUIImage+imageWithCGImage:

于 2011-01-13T23:01:58.660 回答
0

还有另一种使用路径的方法。我已经发布了用圆圈完成的代码,并且可以很容易地编辑以使用任何封闭路径。

如何在椭圆形或圆形上裁剪 UIImage?

于 2013-02-25T00:43:44.667 回答