使用面具裁剪图像

时间:2013-12-06 10:15:32

标签: ios iphone uiimage

我的要求是使用maskImage裁剪图像。 能够裁剪图像但不能达到预期的精确比例。我用谷歌搜索并试图实现它,但不幸的是没有得到预期的结果。这是裁剪图像后的结果。

Before cropping

After cropping 以下是我正在使用的代码。

- (UIImage*) maskImage1:(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 个答案:

答案 0 :(得分:1)

替代

你也可以用CALayers达到同样的效果,而且我认为很清楚。

- (UIImage*) maskImage1:(UIImage *) image withMask:(UIImage *) mask
{
    UIImage* maskedImage = image;

    CALayer *maskLayer = [CALayer layer];

    maskLayer.frame = maskedImage.bounds;
    maskLayer.contents = (__bridge id) mask.CGImage;

    maskedImage.layer.mask = maskLayer;

    return maskedImage;
}

可能是一个解决方案

您的掩码UIImage可能有contentScale错误

mask.layer.contentScale = [UISCreen mainScreen].scale;

您还可以在执行CGImageMaskCreate:

之前强制执行蒙版的大小
mask.frame = image.bounds;

答案 1 :(得分:0)

也许你已经解决了这个问题,但是因为我遇到了同样的问题并且我解决了它,我将解释解决方案:掩码应用于照片的实际大小,在我的情况下它是3264x2448并且逻辑是不是iphone的屏幕尺寸,所以当在图像上应用蒙版时,它变得非常小。我解决了在Photoshop上创建一个具有3264x2448大小的图层并缩放了蒙版以保持与iphone屏幕完全相同的方式。

我遇到的另一个问题是,当我拍照时(我正在使用相机),图像得到了另一个方向,然后我不得不将遮罩转到这个photoshop图层上相同的图片方向。修改方向可以让你改变边,现在的高度是宽度,反之亦然,所以,当我不得不计算尺度时,我必须注意哪一边应该乘以得到正确的尺度。