【问题标题】:iOS UIImage clip to pathsiOS UIImage 剪辑到路径
【发布时间】:2011-11-29 09:54:53
【问题描述】:

我正在处理用户使用 UIBezierPath 选择了其中一部分的图像。如何删除/清除/使不属于该选择的所有内容透明?

【问题讨论】:

    标签: ios uiimage


    【解决方案1】:

    只有一条路很容易。只需将路径设置为剪切路径即可:

    - (UIImage *)maskImage:(UIImage *)originalImage toPath:(UIBezierPath *)path {
        UIGraphicsBeginImageContextWithOptions(originalImage.size, NO, 0);
        [path addClip];
        [originalImage drawAtPoint:CGPointZero];
        UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return maskedImage;
    }
    

    如果你想使用多条路径的并集,那就更难了,因为 Quartz 没有任何函数可以直接计算两条路径的并集。一种方法是将每条路径一个一个地填充到一个蒙版中,然后通过蒙版绘制图像:

    - (UIImage *)maskedImage
    {
        CGRect rect = CGRectZero;
        rect.size = self.originalImage.size;
        UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0); {
            [[UIColor blackColor] setFill];
            UIRectFill(rect);
            [[UIColor whiteColor] setFill];
            for (UIBezierPath *path in self.paths)
                [path fill];
        }
        UIImage *mask = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); {
            CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, mask.CGImage);
            [self.originalImage drawAtPoint:CGPointZero];
        }
        UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return maskedImage;
    }
    

    【讨论】:

    • 哇。没想到这么容易。我找错地方了。剪辑限制了绘图区域,对吧?
    • 嗯,我有多个 nsbezierpath,或者如果我有一个 nsbezierpath,其中笔画相互重叠,这会搞砸。
    • 对不起,这实际上不起作用。我有多个 UIBezierPath 不一定代表剪辑想要的形状,而是选择。剪辑有时一个重叠的多个 UIBezierPath 不会返回正确的图像。
    • @robmayoff 按照您的第一个示例效果很好,只是我的图像保持其原始文件大小。我无法使用 ContentMode 或更改其框架将图像调整为其内容。你知道我能做到吗? CurrentResult
    • 这个 Swift 答案展示了如何使用 UIBezierPath 进行剪辑并获取具有 PNG 格式的 alpha 通道的图像。它还展示了如何将剪辑保存到相机胶卷以及如何将其放入粘贴板。 stackoverflow.com/questions/49853122/…
    【解决方案2】:

    我试过联合多路径的代码,还是不行。

    实际上,如果路径的并集不相互重叠,我们将一条路径附加到另一条路径并使用最终路径进行裁剪。

    UIGraphicsBeginImageContextWithOptions(originalImg.size, NO, 0);
    [path1 appendPath:path2]; // append path2 to path1
    [path1 addClip];
    
    [originalImg drawAtPoint:CGPointZero];
    result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2016-09-18
      • 2016-01-11
      • 2021-02-25
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      相关资源
      最近更新 更多