将 UIImage 剪辑到 UIBezierPath(不遮罩)

2023-12-30

我正在尝试剪辑UIImage基于给定的UIBezierPath,但生成的图像保留原始形状和大小。我希望形状和大小类似于路径,即新图像的可见内容。

看看下面的例子:

以下是我用来屏蔽给定路径的图像的代码:

func imageByApplyingClippingBezierPath(_ path: UIBezierPath) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(CGSize(
        width: size.width,
        height: size.height
    ), false, 0.0)
    let context = UIGraphicsGetCurrentContext()!
    context.saveGState()

    path.addClip()
    draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

    let newImage = UIGraphicsGetImageFromCurrentImageContext()!

    context.restoreGState()
    UIGraphicsEndImageContext()

    return newImage
}

一种解决方案是在遮罩后裁剪图像,但理想情况下我希望这一过程尽可能简单有效地一次性完成。

任何解决方案/提示将不胜感激。


谢谢Rob https://stackoverflow.com/users/1271826/rob我能够使用以下方法实现解决方案cropping(to:)的方法CGImage.

这是一个两步过程,首先我使用给定的路径屏蔽图像,然后使用路径的边界裁剪结果。

以下是我用于实现的最终工作源代码clipping UIBezierPath UIImage扩大:

extension UIImage {

    func imageByApplyingClippingBezierPath(_ path: UIBezierPath) -> UIImage {
        // Mask image using path
        let maskedImage = imageByApplyingMaskingBezierPath(path)

        // Crop image to frame of path
        let croppedImage = UIImage(cgImage: maskedImage.cgImage!.cropping(to: path.bounds)!)
        return croppedImage
    }

    func imageByApplyingMaskingBezierPath(_ path: UIBezierPath) -> UIImage {
        // Define graphic context (canvas) to paint on
        UIGraphicsBeginImageContext(size)
        let context = UIGraphicsGetCurrentContext()!
        context.saveGState()

        // Set the clipping mask
        path.addClip()
        draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        let maskedImage = UIGraphicsGetImageFromCurrentImageContext()!

        // Restore previous drawing context
        context.restoreGState()
        UIGraphicsEndImageContext()

        return maskedImage
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 UIImage 剪辑到 UIBezierPath(不遮罩) 的相关文章

随机推荐

  • 区分数据类型和数据结构

    好吧 不知何故 即使在阅读了很多教科书 真的很多 和在互联网上阅读了很长一段时间后 我仍然无法完全理解所提到的两个事物之间的区别是什么 为了简化问题 根据维基百科 数据类型是 识别各种类型数据之一的分类 例如实数 整数或布尔值 确定该类型的
  • 数字列表的平均值,以字符串形式存储在 Python 列表中

    我想计算python中几个列表的平均值 这些列表包含数字作为字符串 空字符串不是零 它意味着缺少值 我能想到的最好的就是这个 有没有更优雅 简洁 高效的写法 num 1 2 6 total sum int n if n else 0 for
  • 如何在 Mac 上安装 jmeter?

    我们想使用 JMeter 我已按照用户手册中的指示下载了生产版本 http jmeter apache org usermanual get started html http jmeter apache org usermanual ge
  • Dagger 2 无法访问 Retrofit

    我正在尝试使用 Dagger 2 带有 Android 模块 向我的存储库提供一个 Retrofit 实例 购买时我遇到错误 错误 无法访问改造 其他实例 例如毕加索 注入成功 我只是在改造方面遇到问题 我的模块 Module class
  • numpy.std 和 excel STDEV 函数有什么区别吗?

    我有一个清单 s 0 995537725 0 994532199 0 996027983 0 999891383 1 004754272 1 003870012 0 999888944 0 994438078 0 992548715 0 9
  • javascript 数组中的 JSON 导致错误无法读取属性

    我有一些 javascript 已经一年多没有改变了 突然它就坏了 所以我的第一个想法是它一定与数据有关 从数据来看 结构已经一年多没有发生变化 运行了很长一段时间都好好的 突然就坏了 这是我的 js 用一些 JSON 填充数组 var h
  • Spring Sleuth 在向 Zipkin 发送 10% 的请求时卡住了

    默认情况下 Spring Sleuth 仅向 Zipkin 发送 10 的请求 通过设置spring sleuth sampler percentage你可以增加百分比 不幸的是 无论我将其设置为什么值 它都停留在 10 我尝试过1 0 0
  • 如何在pygame中使圆从一个角到另一个角对角移动

    我创建了一个程序来对形状进行动画处理 并且只移动了 x 轴或 y 轴 而从未同时移动过这两个轴 所以对角移动对我来说是全新的 下面是我的代码 Author Victor Xu Date January 20th 2021 Descripti
  • 在sklearn中保存MinMaxScaler模型

    我正在使用MinMaxScalersklearn 中的模型用于标准化模型的特征 training set np random rand 4 4 10 training set 6 01144787 0 59753007 2 0014852
  • InvalidOperationException:集合已修改 - 尽管锁定了集合

    我有一个同步哈希表 我定期从中删除一些条目 多个线程运行此代码 因此 我锁定了整个 foreach 但有时仍然会收到 InvalidOperationException Collection was generated at Hashtab
  • 该类不符合键的键值编码[重复]

    这个问题在这里已经有答案了 我目前正在通过 Jeff LaMarche 的 iPhone 4 开发入门 学习如何为 iPhone 编写代码 但遇到了一个问题 我似乎看不出问题出在哪里 我在许多论坛上读到 这是 IBOutlet 连接不正确的
  • 给定运行时数据,如何知道排序程序是使用冒泡排序还是插入排序?

    我测量了一个排序程序 算法 并根据运行时数据 将其范围缩小为两种排序算法 冒泡排序和插入排序 有没有办法确定它是哪一个 当然是在不知道代码的情况下 它们都有相同的时间复杂度 我已经没有主意了 时间复杂度数据 排序 O n 1000 个数字所
  • Android 谷歌地图 api v2 夜间模式

    我正在开发一个使用全屏谷歌地图 API 2 的Android应用程序 例如 使用我的应用程序的司机希望在晚上 10 点到早上 6 点之间使用 夜间模式 这在 Android 中可能吗 将地图模式更改为 夜间 类似于Android手机中已有的
  • 我可以控制 IE 10 选择框的位置吗?

    在 Internet Explorer 10 中 下拉框的行为
  • C++ 从字符串中去除非 ASCII 字符

    在开始之前 是的 我知道这是一个重复的问题 是的 我已经查看了发布的解决方案 我的问题是我无法让他们工作 bool invalidChar char c return isprint unsigned c void stripUnicode
  • 从 Firebase 中删除 Google 或 Facebook 用户

    要从身份验证选项卡中删除用户 我使用以下代码 if let user FIRAuth auth currentUser user delete completion nil 当用户使用电子邮件 密码组合注册时 这工作得很好 但当他们使用社交
  • `alloc::rc::Rc` 和 `std::rc::Rc` 有什么区别?

    我很好奇这两个模块在实践中是否有区别 如果没有 为什么会有这两个副本呢 std rc Rc只是再出口alloc rc Rc 你可以看到在src std lib rs https doc rust lang org nightly src s
  • 使用 Nginx 在 OpenSuse 上启用 php5-curl

    我有 OpenSuse Server 10 3 和 nginx 作为 Web 服务器 我需要启用 php5 curl 安装成功了 然后重新启动网络服务器 但没有任何变化 有任何想法吗 谢谢 您可能还没有真正加载扩展 查看 phpinfo 以
  • 如何将 darknet YOLOv4 视频的每一帧输出保存在 txt 文件中?

    我在用darknet https github com AlexeyAB darknet在我的定制数据集上使用 YOLOv4 检测对象 对于视频检测 我使用 darknet detector demo data obj data yolo
  • 将 UIImage 剪辑到 UIBezierPath(不遮罩)

    我正在尝试剪辑UIImage基于给定的UIBezierPath 但生成的图像保留原始形状和大小 我希望形状和大小类似于路径 即新图像的可见内容 看看下面的例子 以下是我用来屏蔽给定路径的图像的代码 func imageByApplyingC