从AVCapturePhoto的fileDataRepresentation中获取的数据生成UIImage,怎么获取其RGB信息

发布于 2022-09-12 23:53:17 字数 3393 浏览 43 评论 0

我是个新手,公司派了个关于IOS图片分析的任务给我,我尝试过网络上大部分的代码,而现在我的代码是这个样子:

extension UIImage {
    func isRed() -> Bool {
        
        let type = self.cgImage?.bitmapInfo.pixelFormat
        
        let width = Int(self.size.width)
        let height = Int(self.size.height)
        
        let imageData = self.cgImage!.dataProvider!.data
        let data: UnsafePointer = CFDataGetBytePtr(imageData)
        let scale = UIScreen.main.scale
//        for ind in 0..<200000 {
//            Logger.debug("liu-526 <-" + CGFloat(data[ind]).description + "->")
//        }
        
        var redPixel = 0
        
        Logger.debug("liu-526 " + self.cgImage!.bitsPerPixel.description)
        for pixelX in 0..<width {
            for pixelY in 0..<height {
                let address: Int = ((Int(self.size.width) * Int(CGFloat(pixelY) * scale)) + Int(CGFloat(pixelX) * scale)) * 4
                
                let position1 = CGFloat(data[address])
                let position2 = CGFloat(data[address + 1])
                let position3 = CGFloat(data[address + 2])
                let position4 = CGFloat(data[address + 3])
                let position5 = CGFloat(data[address + 4])
//                Logger.debug("liu-526 <-" + position1.description + "," + position2.description + "," + position3.description + "," + position4.description + "->")

                var red = 0
                var green = 0
                var blue = 0
                switch type {
                case .rgba:
                    red = Int(position1)
                    green = Int(position2)
                    blue = Int(position3)
                case .bgra:
                    red = Int(position3)
                    green = Int(position2)
                    blue = Int(position1)
                case .abgr:
                    red = Int(position4)
                    green = Int(position3)
                    blue = Int(position2)
                case .argb:
                    red = Int(position2)
                    green = Int(position3)
                    blue = Int(position4)
                default:
                    break
                }
                
                let postr1 = " x:" + pixelX.description + " y:" + pixelY.description + " "
                let postr = postr1 + " adr:" + address.description + " "
                Logger.debug("liu-525 " + postr + position1.description + "-" + position2.description + "-" + position3.description + "-" + position4.description + "-" + position5.description)
                
                if red > (((green + blue) / 2) + 10) {
                    redPixel += 1
                }
                //                Logger.debug("liu-13r " + r.description)
                //                Logger.debug("liu-13g " + g.description)
                //                Logger.debug("liu-13b " + b.description)
            }
        }
        return redPixel > (width * height) / 2
    }
}

我认为判断类型是不必要的,但无论判断和不判断我都无法获取正确的图片:

输入的图片:

输出的图片:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文