通过自定义形状裁剪 UIImage

Posted

技术标签:

【中文标题】通过自定义形状裁剪 UIImage【英文标题】:Cropping UIImage by custom shape 【发布时间】:2016-10-05 05:29:59 【问题描述】:

我有一个背景 UIImage,我想用自定义形状裁剪背景 UIImage,所以这个背景图像只能通过自定义形状“出现”。例如,我有一个月亮形状的自定义形状,我希望背景图像只出现在月亮形状的部分。

根据另一个答案,我正在尝试像这样在图像上施加蒙版:

- (UIImage *)createImageFromImage:(UIImage *)image
                    withMaskImage:(UIImage *)mask 
    CGImageRef imageRef = image.CGImage;
    CGImageRef maskRef = mask.CGImage;

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                             CGImageGetHeight(maskRef),
                                             CGImageGetBitsPerComponent(maskRef),
                                             CGImageGetBitsPerPixel(maskRef),
                                             CGImageGetBytesPerRow(maskRef),
                                             CGImageGetDataProvider(maskRef),
                                             NULL,
                                             YES);

    CGImageRef maskedReference = CGImageCreateWithMask(imageRef, imageMask);
    CGImageRelease(imageMask);

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference];
    CGImageRelease(maskedReference);

    return maskedImage;

但是,这个结果看起来像,它有几个问题:

    我的月亮是100*100,这个比例拉长了很奇怪 我的目标只是让图像穿过月球 - 然而,此刻月亮是一个白色的形状,正从图像上方飞过

任何关于如何解决作物问题的想法都将不胜感激。谢谢!

【问题讨论】:

您可以将此库用于任何自定义形状。只需画出你的路径,你就会得到裁剪的图像。 cocoacontrols.com/controls/mdimagecroper 【参考方案1】:

在您的背景图片上,您必须通过CALayer 添加自定义蒙版。 请记住,您在 mask.png(月亮)中着色的所有内容都是可见的,所有 透明 都不会显示。

UIImage *moonImage = [UIImage imageNamed:@"mask.png"];
CALayer *maskLayer = [CALayer layer];
[maskLayer setContents:(id)moonImage.CGImage];
[maskLayer setFrame:CGRectMake(0.0f, 0.0f, moonImage.size.width, moonImage.size.height)];

UIImageView *yourBackgroundImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
// Keep your image view in tact here, just add:
[yourBackgroundImageView.layer setMask:maskLayer];

【讨论】:

这很好用,并且达到了我需要的结果。谢谢! @daspianist 我需要准确的行为。我应该在哪里写上面的代码?

以上是关于通过自定义形状裁剪 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

自定义图像裁剪器android

在图像 Python 中裁剪自定义区域 [关闭]

带有波纹动画的Android自定义视图边缘裁剪

如何将图像拉伸成自定义形状(swift3)

使用 Objective C 自定义相机捕捉图像和裁剪

Android 自定义图像视图形状