在iOS中使用另一个实际图像屏蔽透明图像

时间:2015-01-25 04:08:16

标签: ios objective-c image

我有两个图像,一个是透明的边框/边框,另一个是实际图像。我想合并他们两个。

enter image description here enter image description here

我使用以下代码来掩盖和组合图像:

 - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

    // create a bitmap graphics context the size of the image
    CGFloat dim = MIN(image.size.width, image.size.height);
    CGSize size = CGSizeMake(dim, dim);
    UIGraphicsBeginImageContextWithOptions(size, NO, .0);
    UIBezierPath *bezierPath = [UIBezierPath bezierPathWithOvalInRect:(CGRect){ CGPointZero, size }];
    [bezierPath fill];
    [bezierPath addClip];
    CGPoint offset = CGPointMake((dim - image.size.width) * 0.5, (dim - image.size.height) * 0.5);
    [image drawInRect:(CGRect){ offset, image.size }];
    UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return ret;
}

结果:

enter image description here

在结果图像中,缺少用作蒙版的图像边框。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

我为ios编写了一个屏蔽类别(它基本上是跨平台的,因为CoreImage无论如何都在两个平台上:

github project

核心功能归结为此(对于您的示例)

UIImage *person = ...
UIImage *circle = ...
UIImage *result = [person imageMaskedWith:circle];

UIImageView *redbox = [[UIImageView alloc] initWithImage:result];
redbox.backgroundColor = [UIColor redColor]; //this can be a gradient!

该类别代码的主要部分:

CGImageRef imageReference = image.CGImage;
CGImageRef maskReference = mask.CGImage;
CGRect rect = CGRectMake(0, 0, CGImageGetWidth(imageReference), CGImageGetHeight(imageReference));

// draw with Core Graphics
UIGraphicsBeginImageContext(rect.size);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(bitmap, 0.0, rect.size.height);
CGContextScaleCTM(bitmap, 1.0, -1.0);

CGContextClipToMask(bitmap, rect, maskReference);
CGContextDrawImage(bitmap, rect, imageReference);

newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();