【问题标题】:Mask a UIImage programmatically以编程方式屏蔽 UIImage
【发布时间】:2015-08-19 16:08:03
【问题描述】:

我试图通过以编程方式创建CGImageRef mask 并通过CGImageCreateWithMask() 应用它来屏蔽UIImage。这是我的方法:

- (UIImage *)imageByMaskingHalfImage:(UIImage *)image {
    UIGraphicsBeginImageContextWithOptions((CGSize){image.size.width, image.size.height}, NO, image.scale);

    [[UIColor blackColor] setFill];
    UIRectFill(CGRectMake(0, 0, image.size.width / 2, image.size.height));

    [[UIColor whiteColor] setFill];
    UIRectFill(CGRectMake(image.size.width / 2, 0, image.size.width / 2, image.size.height));

    UIImage *maskImage  = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CGImageRef maskImageRef = CGImageMaskCreate(CGImageGetWidth(maskImage.CGImage),
                                                CGImageGetHeight(maskImage.CGImage),
                                                CGImageGetBitsPerComponent(maskImage.CGImage),
                                                CGImageGetBitsPerPixel(maskImage.CGImage),
                                                CGImageGetBytesPerRow(maskImage.CGImage),
                                                CGImageGetDataProvider(maskImage.CGImage),
                                                NULL,
                                                NO);
    CGImageRef imageRef = CGImageCreateWithMask(image.CGImage, maskImageRef);
    image = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation];
    CGImageRelease(maskImageRef);
    CGImageRelease(imageRef);

    return image;
}

预览maskImage 时,我可以看到它被正确渲染:图像的一半是黑色的,一半是白色的。但是,生成的蒙版image 保持不变,整个图像都是可见的。

我已阅读文档,但找不到问题所在。我的代码中一定有一些愚蠢的错误,或者我误解了什么。

【问题讨论】:

    标签: objective-c uiimage core-graphics quartz-2d


    【解决方案1】:

    这就是我以 A 形遮盖图像的方式

    创建一个获取蒙版形状的方法,在我的例子中是形状 A:

      -(void)shapeA:(CGRect)frame :(UIImageView*) testView {
    
        ////  Drawing
        UIBezierPath* textPath = UIBezierPath.bezierPath;
        [textPath moveToPoint: CGPointMake(CGRectGetMinX(frame) + 284.92, CGRectGetMinY(frame) + 243.03)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 230.48, CGRectGetMinY(frame) + 84.58)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 172.62, CGRectGetMinY(frame) + 243.03)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 284.92, CGRectGetMinY(frame) + 243.03)];
        [textPath closePath];
        [textPath moveToPoint: CGPointMake(CGRectGetMinX(frame) + 205.09, CGRectGetMinY(frame) + 31.36)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 260.02, CGRectGetMinY(frame) + 31.36)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 390.14, CGRectGetMinY(frame) + 390)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 336.92, CGRectGetMinY(frame) + 390)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 300.54, CGRectGetMinY(frame) + 282.58)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 158.7, CGRectGetMinY(frame) + 282.58)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 119.88, CGRectGetMinY(frame) + 390)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 70.08, CGRectGetMinY(frame) + 390)];
        [textPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 205.09, CGRectGetMinY(frame) + 31.36)];
        [textPath closePath];
    
        CAShapeLayer *shapeLayer = [CAShapeLayer layer];
        shapeLayer.path = textPath.CGPath;
        shapeLayer.strokeColor   = [UIColor clearColor].CGColor;
        shapeLayer.fillColor     = [UIColor whiteColor].CGColor;
    
        [testView.layer setMask:shapeLayer];
    
    }
    

    上述方法在名为 SHapeLayer 的 NSObject 文件中声明。

    并在您的视图控制器中调用此方法:

    -(void)callShape{
    
    CGRect temp=self.imageView.bounds;
    ShapeLayer *sl=[[ShapeLayer alloc]init];
      [sl shapeA:temp :self.imageView];
    }
    

    现在在加载图像之前调用此方法[self callShape];

    【讨论】:

    • 谢谢,但如果可能的话,我宁愿直接屏蔽UIImage(最好通过使用CGImageCreateWithMask())而不是屏蔽UIImageView
    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 2011-06-30
    • 2019-08-19
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多