如何使用掩码保存UIImage

时间:2013-02-26 01:14:00

标签: ios uiimageview uiimage masking cgimage

我有UIImageView可以移动/缩放(self.imageForEditing)。在这个图像视图的顶部,我有一个带有孔的覆盖层,它是静态的,不能移动。我需要保存按下按钮时通过孔可见的底层图像部分。我目前的尝试:

- (IBAction)saveImage
{

    UIImage *image = self.imageForEditing.image;

    CGImageRef originalMask = [UIImage imageNamed:@"picOverlay"].CGImage;
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(originalMask),
                                        CGImageGetHeight(originalMask),
                                        CGImageGetBitsPerComponent(originalMask),
                                        CGImageGetBitsPerPixel(originalMask),
                                        CGImageGetBytesPerRow(originalMask),
                                        CGImageGetDataProvider(originalMask), nil, YES);

    CGImageRef maskedImageRef = CGImageCreateWithMask(image.CGImage, mask);

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef scale:image.scale orientation:image.imageOrientation];

    CGImageRelease(mask);
    CGImageRelease(maskedImageRef);

    UIImageView *test = [[UIImageView alloc] initWithImage:maskedImage];
    [self.view addSubview:test];
}

作为测试,我只是尝试将新创建的图像添加到屏幕的左上角。从理论上讲,它应该是一个小圆形图像(通过叠加层可见的部分)。但我只是重新创建了整个图像。我究竟做错了什么?我如何解释self.imageForEditing可以移动的事实?

1 个答案:

答案 0 :(得分:0)

CGImageCreateWithMask返回与原始图像大小相同的图像。 这就是为什么你得到原始图像(我假设)与应用蒙版。

您可以应用蒙版然后删除不可见的边框。使用此问题的建议:iOS: How to trim an image to the useful parts (remove transparent border)

找到图像的非透明部分的边界并将其重新绘制成新图像。