【问题标题】:masking a UIImage屏蔽 UIImage
【发布时间】:2011-02-16 03:10:18
【问题描述】:

我正在开发一个可以更改边框或矩形 UIImage 的应用程序。边框会有所不同,但看起来 UIImage 是用剪刀剪掉的,或者类似的东西。

最好的方法是什么?

我的第一个想法是准备一堆具有我正在寻找的正确边框效果的透明 PNG,然后以某种方式将其用作我的 UIImage 的蒙版。这是正确的道路吗?还是有更灵活的编程方式来做到这一点?

【问题讨论】:

    标签: cocoa-touch uiimage core-graphics transparent mask


    【解决方案1】:

    是的,这就是你需要做的。最好的方法是使用 Core Graphics; Quartz 2D 编程指南有一个article describing how to mask images with other images。您可以通过CGImage 属性从UIImage 对象获取CGImageRef(这些Core Graphics 方法使用),然后使用UIImage 从更改的(屏蔽的)CGImageRef 返回UIImage类方法+imageWithCGImage:.

    【讨论】:

    • 如果 UIImage 中的 CGImage 是从 CIImage 创建的,则它为 null,所以要小心。
    【解决方案2】:

    以下是可用于屏蔽图像的 Core Graphics 调用:

    //Mask Image
    UIImage *inputImage = [UIImage imageNamed:@"inputImage.png"];
    CGImageRef maskRef = [UIImage imageNamed:@"mask.png"].CGImage; 
    
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);
    
    CGImageRef masked = CGImageCreateWithMask([inputImage CGImage], mask);
    CGImageRelease(mask);
    
    UIImage *maskedImage = [UIImage imageWithCGImage:masked];
    
    CGImageRelease(masked);
    

    【讨论】:

    • 谢谢!一直想知道如何做到这一点。对于后代,您的第一个 UIImage 分配中有一个小错字:应该像您的第二个一样说 imageNamed
    • 需要将imageWithCGImage:更新为imageWIthCGImage:scale:orientation:
    【解决方案3】:

    为此您需要图像遮罩,我写了一个tutorial on how to use it 以及我如何在自己的应用程序中使用它。

    以下示例代码应该可以帮助您入门,它需要原始图像和蒙版图像作为输入,并返回蒙版图像作为输出。

    - (UIImage*) maskImage:(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;
    }
    

    【讨论】:

    • 我一直在研究这个,不幸的是我无法让它工作。我把图片放在第一个参数里,第二个参数里是黑白图片,两者大小一样,输出和第一个参数一模一样。
    • 您的教程链接已损坏。
    【解决方案4】:

    还有另一种使用路径的方法。我已经发布了使用圆圈的代码,并且可以轻松编辑以使用任何封闭路径。

    How to crop UIImage on oval shape or circle shape?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      相关资源
      最近更新 更多