我正在开发一款可以更改边框或矩形UIImage的应用。边框会有所不同,但看起来UIImage会被用剪刀剪掉,或者会产生影响。
这样做的最佳方式是什么?
我的第一个想法是准备一堆透明的PNG,它具有我正在寻找的正确边框效果,然后以某种方式将其用作我的UIImage的面具。这是正确的道路吗?或者是否有更灵活的编程方式来做到这一点?
答案 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)
还有另一种方法可以通过路径执行此操作。我发布的代码用圆圈表示,可以轻松编辑以适应任何封闭的路径。