swift - 如何不使深灰色变得透明,从图像中去除背景

标签 swift xcode cifilter ciimage chromakey

我遇到一个问题,当我尝试从图像中删除绿色(在本例中为图像背景)时,但所有深灰色(在我想要保留的图像部分内)都变成半透明。我不确定为什么,想要一些关于如何的建议:

    func chromaKeyFilter(fromHue: CGFloat, toHue: CGFloat) -> CIFilter? {
        let size = 64
        var cubeRGB = [Float]()

        for z in 0 ..< size {
            let blue = CGFloat(z) / CGFloat(size-1)
            for y in 0 ..< size {
                let green = CGFloat(y) / CGFloat(size-1)
                for x in 0 ..< size {
                    let red = CGFloat(x) / CGFloat(size-1)

                    let color = UIColor(red: red, green: green, blue: blue, alpha: 1)
                    let hueColor = color.hsbColor
                    let alpha: CGFloat = (hueColor.hue >= fromHue && hueColor.hue <= toHue) ? 0 : 1
                    cubeRGB.append(Float(red * alpha))
                    cubeRGB.append(Float(green * alpha))
                    cubeRGB.append(Float(blue * alpha))
                    cubeRGB.append(Float(alpha))
                }
            }
        }

        let data = Data(bytes: cubeRGB, count: cubeRGB.count * MemoryLayout<Float>.size)
        let params: [String: Any] = ["inputCubeDimension": size, "inputCubeData": data]
        return CIFilter(name: "CIColorCube", parameters: params)
    }

    func filterPixels(foregroundCIImage: CIImage) -> CIImage {
        let chromaCIFilter = self.chromaKeyFilter(fromHue: 0.33, toHue: 0.34)
         chromaCIFilter?.setValue(foregroundCIImage, forKey: kCIInputImageKey)
         let sourceCIImageWithoutBackground = chromaCIFilter?.outputImage
         var image = CIImage()
         if let filteredImage = sourceCIImageWithoutBackground {
             image = filteredImage
         }
         return image
     }
}


extension UIColor {
    /// Decomposes UIColor to its HSBA components
    var hsbColor: HSBColor {
        var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
        self.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
        return HSBColor(hue: h, saturation: s, brightness: b, alpha: a)
    }

    /// Holds the CGFloat values of HSBA components of a color
    public struct HSBColor {
        var hue: CGFloat
        var saturation: CGFloat
        var brightness: CGFloat
        var alpha: CGFloat
    }
}

示例图片:

enter image description here

最佳答案

您的代码是正确的,但请记住,深灰色实际上可能是非常深的绿色。

在这一行:

let alpha: CGFloat = (hueColor.hue >= fromHue && hueColor.hue <= toHue) ? 0 : 1

我会考虑亮度/饱和度。例如

let alpha: CGFloat = (hueColor.saturation > 0.1 && hueColor.hue >= fromHue && hueColor.hue <= toHue) ? 0 : 1

关于swift - 如何不使深灰色变得透明,从图像中去除背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60999480/

相关文章:

ios - 如何通过 UISwitch 改变变量的值?

ios - 如何使用 UISlider 更改视频的 CIFilter 值?

iphone - CIFilter filterWithName :keysAndValues: set keysAndValues from NSDictionary

swift - PickerView 的 selectRow 如何影响 Button 的启用?

ios - 如何从单独的 .swift 文件访问常量

ios - 使用 Xib 在 Tableview header 中快速重新加载 CollectionView

ios - CIHeightFieldFromMask 输出图像与输入相同

ios - Firebase Remote Config A/B 测试草案不提供 iOS 上的值

ios - NSPersisten[NSPersistentStoreCoordinator 崩溃

objective-c - 图形图像保存在文本编辑器中?