iOS Swift Flood 填充算法

2023-11-22

我为接触点的“桶填充”(洪水填充)创建了这个扩展:

extension UIImageView {

    func bucketFill(startPoint: CGPoint, newColor: UIColor) {
        var newRed, newGreen, newBlue, newAlpha: CUnsignedChar

        let pixelsWide = CGImageGetWidth(self.image!.CGImage)
        let pixelsHigh = CGImageGetHeight(self.image!.CGImage)
        let rect = CGRect(x:0, y:0, width:Int(pixelsWide), height:Int(pixelsHigh))

        let bitmapBytesPerRow = Int(pixelsWide) * 4


        var context = self.image!.createARGBBitmapContext()

        //Clear the context
        CGContextClearRect(context, rect)

        // Draw the image to the bitmap context. Once we draw, the memory
        // allocated for the context for rendering will then contain the
        // raw image data in the specified color space.
        CGContextDrawImage(context, rect, self.image!.CGImage)

        var data = CGBitmapContextGetData(context)
        var dataType = UnsafeMutablePointer<UInt8>(data)

        let newColorRef = CGColorGetComponents(newColor.CGColor)
        if(CGColorGetNumberOfComponents(newColor.CGColor) == 2) {
            newRed = CUnsignedChar(newColorRef[0] * 255) // CUnsignedChar
            newGreen = CUnsignedChar(newColorRef[0] * 255)
            newBlue = CUnsignedChar(newColorRef[0] * 255)
            newAlpha = CUnsignedChar(newColorRef[1])
        } else {
            newRed = CUnsignedChar(newColorRef[0] * 255)
            newGreen = CUnsignedChar(newColorRef[1] * 255)
            newBlue = CUnsignedChar(newColorRef[2] * 255)
            newAlpha = CUnsignedChar(newColorRef[3])
        }
        let newColorStr = ColorRGB(red: newRed, green: newGreen, blue: newBlue)

        var stack = Stack()

        let offset = 4*((Int(pixelsWide) * Int(startPoint.y)) + Int(startPoint.x))
        //let alpha = dataType[offset]
        let startRed: UInt8 = dataType[offset+1]
        let startGreen: UInt8 = dataType[offset+2]
        let startBlue: UInt8 = dataType[offset+3]

        stack.push(startPoint)

        while(!stack.isEmpty()) {

            let point: CGPoint = stack.pop() as! CGPoint

            let offset = 4*((Int(pixelsWide) * Int(point.y)) + Int(point.x))
            let alpha = dataType[offset]
            let red: UInt8 = dataType[offset+1]
            let green: UInt8 = dataType[offset+2]
            let blue: UInt8 = dataType[offset+3]

            if (red == newRed && green == newGreen && blue == newBlue) {
                continue
            }

            if (red.absoluteDifference(startRed) < 4 && green.absoluteDifference(startGreen) < 4 && blue.absoluteDifference(startBlue) < 4) {

                dataType[offset] = 255
                dataType[offset + 1] = newRed
                dataType[offset + 2] = newGreen
                dataType[offset + 3] = newBlue

                if (point.x > 0) {
                    stack.push(CGPoint(x: point.x - 1, y: point.y))
                }

                if (point.x < CGFloat(pixelsWide)) {
                    stack.push(CGPoint(x: point.x + 1, y: point.y))
                }

                if (point.y > 0) {
                    stack.push(CGPoint(x: point.x, y: point.y - 1))
                }

                if (point.y < CGFloat(pixelsHigh)) {
                    stack.push(CGPoint(x: point.x, y: point.y + 1))
                }
            } else {

            }
        }

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue)
        let finalContext = CGBitmapContextCreate(data, pixelsWide, pixelsHigh, CLong(8), CLong(bitmapBytesPerRow), colorSpace, bitmapInfo)

        let imageRef = CGBitmapContextCreateImage(finalContext)
        self.image = UIImage(CGImage: imageRef, scale: self.image!.scale,orientation: self.image!.imageOrientation)
    }
}

现在我想提高性能。我怎样才能让这个算法运行得更快? UInt8.absoluteDifference 扩展是我尝试包含几乎相同的颜色来进行洪水填充,它正在工作,但这确实可以改进,我知道,但我不知道如何改进。

extension UInt8 {

    func absoluteDifference(subtrahend: UInt8) -> UInt8 {
        if (self > subtrahend) {
            return self - subtrahend;
        } else {
            return subtrahend - self;
        }
    }
}

我的堆栈类:

class Stack {
    var count: Int = 0
    var head: Node = Node()

    init() {
    }

    func isEmpty() -> Bool {
        return self.count == 0
    }

    func push(value: Any) {
        if isEmpty() {
            self.head = Node()
        }

        var node = Node(value: value)
        node.next = self.head
        self.head = node
        self.count++
    }

    func pop() -> Any? {
        if isEmpty() {
            return nil
        }

        var node = self.head
        self.head = node.next!
        self.count--

        return node.value
    }
}

感谢帮助


None

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

iOS Swift Flood 填充算法 的相关文章

随机推荐

  • 颜色的十六进制透明度[重复]

    这个问题在这里已经有答案了 我正在努力为我的应用程序小部件实现小部件透明度选项 尽管我在获取正确的十六进制颜色值时遇到了一些麻烦 作为十六进制颜色透明度的新手 我进行了一些搜索 尽管我找不到我的问题的具体答案 我想通过十六进制颜色设置透明度
  • 如果 Maven 中的传递依赖项来自我父级的其他子模块,我是否应该依赖它们?

    假设我们正在研究mortgage子模块 我们直接使用Google Guava模块代码中的类 但依赖项guava在同一父模块下的其他子模块中定义 我们只能通过对 investment 模块的传递依赖来访问 Guava 类 banking sy
  • UIScrollView 上的边界会随着内容插入而自动更改

    我使用 UIScrollView 作为我的分页滚动视图 pagesScrollView 在其中 我放置了专门用于缩放的单独的 UIScrollView 在每个视图中 我都有一个视图 该视图是应该可缩放的页面项目 所有这些都位于带有半透明导航
  • System.DirectoryServices 很慢?

    当用户登录网站时 我使用下面的代码在活动目录中查找信息 针对本地域运行速度非常快 但通过 VPN 运行到远程受信任域时 速度非常慢 大约需要 7 或 8 秒 从同一个机器到远程域运行 dsa msc 几乎与在本地运行它一样快 我正在使用属性
  • JavaScript 有类吗?

    上周我和一个朋友发生了争执 他说 JavaScript 中不存在类这样的东西 我说有你可以说的var object new Object 他说 因为没有文字class用过的 这不是一个班级 谁是对的 编辑 2017 年 7 月 ECMASc
  • 向 TList 和 TStringList 添加稳定排序的简单方法

    我将 TList TObjectList 和 TStringList 带有关联对象 用于多种任务 或者按原样使用 或者作为更复杂结构的基础 虽然排序功能通常足够好 但有时我需要做一个stable排序 两个列表都使用快速排序 为 TList
  • 添加 cache.manifest 后,AngularJS/PouchDB 应用程序停止同步到 CouchDB

    我有一个使用 AngularJS 编写的单页 Web 应用程序 它使用 PouchDB 复制到 CouchDB 服务器并且工作正常 当我尝试通过添加cache manifest 将网页转换为可离线使用时 问题就出现了 突然间 所有复制任务都
  • 对 CouchDB 视图中的日期进行排序

    我有一个嵌套的 JSON 对象作为键status below 2011 01 19 09 41 00 AM Prototyping status application 2011 01 20 09 41 00 AM Playing with
  • 如何按字母数字对数字进行排序

    Input SHC 111U SHB 22x SHA 5555G 所需输出 SHB 22X SHC 111U SHA 5555G 我只需要排序Vehicle no在停车场内没有前缀和后缀字母 出色的 优化良好的开源解决方案 位于http d
  • 在 Visual Studio Code 中以编程方式检测亮/暗主题

    我正在开发 Visual Studio Code扩大可以预览mermaid图表 该扩展使用默认样式表 如果使用浅色主题 该样式表可以正常工作 但是 如果用户已将 Visual Studio Code 切换为使用深色主题 则样式表中的一些规则
  • 使用 JavaScript 访问 iPhone 指南针

    知道是否可以使用 JavaScript 在 Safari 中访问 iPhone 指南针 我懂了如何访问 GPS 但我认不出指南针 On iOS 您可以检索compass像这样的值 window addEventListener device
  • 遍历目录树的方式有哪几种?

    如何用您最喜欢的语言遍历目录树 要在不同操作系统中遍历目录树 您需要了解什么 在不同的文件系统上 您最喜欢的帮助遍历目录树的库 模块是什么 In Python 如果您正在寻找快速 干净且便携的解决方案 请尝试 import os base
  • 将created_at和updated_at字段添加到mongoose模式

    有没有办法添加created at和updated at字段到猫鼬模式 而不必每次都将它们传递给新的MyModel 叫做 The created at字段将是一个日期 并且仅在创建文档时添加 这updated at字段将在任何时候更新为新日
  • 爪哇。比较字符串时忽略重音符号

    问题很简单 JAVA中有没有函数可以比较两个字符串并返回true 忽略重音字符 ie String x Joao String y Jo o 返回相等的 Thanks 我认为你应该使用Collator班级 它允许您设置强度和区域设置 并且它
  • 绝对/相对定位布局溢出

    在相当长的一段时间里 我一直在摆弄一个特定的布局问题 但我显然采用了错误的方式 以下是该方法的基本组成部分 div class stretched div class header SOME HEADER div div class som
  • 身份验证失败:Devise + OmniAuth + Twitter

    我正进入 状态 twitter Authentication failure invalid credentials OAuth Unauthorized 401 Unauthorized成功登录 Twitter 并且页面重定向到登录页面后
  • Hibernate Oracle 表空间注释

    我正在注释我的 DAO 并使用 hibernate3 hbm2ddl 生成 ddls 有没有办法注释表空间 不 没有办法开箱即用 我过去使用以下相当复杂的方法解决了这个问题 创建您自己的注释 TableSpec具有表空间和其他必要的属性 E
  • 复选框的 CSS 边框

    我正在应用 jQuery 复选框的样式 reg checkbox css border thin solid red 边框在 IE 中工作正常 但在 mozilla 中不行 如何使其兼容浏览器 使用大纲 http jsfiddle net
  • Visual Studio 组件缓存已过期

    几乎每次我尝试运行 EF 迁移的 update database 命令时 我都会在 Visual Studio 2015 中收到以下错误 使用 1 个参数调用 GetService 时发生异常 异常 使用 2 个参数调用 Invoke Vi
  • iOS Swift Flood 填充算法

    我为接触点的 桶填充 洪水填充 创建了这个扩展 extension UIImageView func bucketFill startPoint CGPoint newColor UIColor var newRed newGreen ne