繁体   English   中英

通过自定义形状裁剪UIImage

[英]Cropping UIImage by custom shape

我有一个背景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;
}

但是,结果看起来像 在此处输入图片说明 ,并且有几个问题:

  1. 我的月亮是100 * 100,这已经拉伸了一个奇怪的比例
  2. 我的目标仅是使图像穿过月球-但是,此刻,月亮是白色的形状,即将越过图像

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

在背景图片上,您必须通过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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM