【问题标题】:Convert UIImage to Monochrome 1 bit bmp image Swift 5.1将 UIImage 转换为单色 1 位 bmp 图像 Swift 5.1
【发布时间】:2020-02-28 10:19:16
【问题描述】:

PS:我想要的结果是 [Bool] 格式。即,0 表示背景,1 表示除背景以外的任何颜色。

我有一个每像素 32 位的 UIImage。如何制作二值图像(即 1bit .bmp 图像)

我正在使用下面的代码:但它全部为零

  public extension UIImage {

        func pixelData() -> [UInt8]? {
                let size = self.size
                let dataSize = size.width * size.height
                var pixelData = [UInt8](repeating: 0, count: Int(dataSize))
                let colorSpace = CGColorSpaceCreateDeviceRGB()
                let context = CGContext(data: &pixelData,
                                        width: Int(size.width),
                                        height: Int(size.height),
                                        bitsPerComponent: 1,
                                        bytesPerRow:Int(size.width),
                                        space: colorSpace,
                                        bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)
                guard let cgImage = self.cgImage else { return nil }
                context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

                return pixelData
            }
}

【问题讨论】:

  • 已编辑。我必须使用哪个色彩空间?灰色样式可以吗?

标签: ios swift image-processing


【解决方案1】:

我已经创建了一个可能有点牵强的解决方案。

首先,我创建了一个像素结构,描述了一个像素代表什么。

struct Pixel {

    var r: Float
    var g: Float
    var b: Float
    var a: Float
    var row: Int
    var col: Int

    init(r: UInt8, g: UInt8, b: UInt8, a: UInt8, row: Int, col: Int) {
        self.r = Float(r)
        self.g = Float(g)
        self.b = Float(b)
        self.a = Float(a)
        self.row = row
        self.col = col
    }

    var color: UIColor {
        return UIColor(
            red: CGFloat(r/255.0), 
            green: CGFloat(g/255.0), 
            blue: CGFloat(b/255.0), 
            alpha: CGFloat(a/255.0)
        )
    }

    var description: String {
        return "\(r), \(g), \(b), \(a)"
    }

}

然后我创建了一个 UIImage 扩展。

extension UIImage {

    var pixelData: [Pixel] {
        let bmp = self.cgImage!.dataProvider!.data
        var data: UnsafePointer<UInt8> = CFDataGetBytePtr(bmp)
        var r, g, b, a: UInt8
        var pixels = [Pixel]()

        for row in 0 ..< Int(self.size.width) {
            for col in 0 ..< Int(self.size.height) {
                r = data.pointee
                data = data.advanced(by: 1)
                g = data.pointee
                data = data.advanced(by: 1)
                b = data.pointee
                data = data.advanced(by: 1)
                a = data.pointee
                data = data.advanced(by: 1)
                pixels.append(Pixel(r: r, g: g, b: b, a: a, row: row, col: col))
            }
        }
        return pixels
    }

    var monochrome: UIImage? {
        let context = CIContext(options: nil)
//        let currentFilter = CIFilter(name: "CIPhotoEffectNoir")
        let currentFilter = CIFilter(name: "CIColorMonochrome")
        currentFilter?.setValue(CIImage(image: self), forKey: kCIInputImageKey)
        guard let output = currentFilter?.outputImage, 
              let cgImage = context.createCGImage(output, from: output.extent) else {
            print("Failed to create output image")
            return nil
        }
        return UIImage(cgImage: cgImage, scale: scale, orientation: imageOrientation)
    }

}

我确实创建了单色滤镜,您可以看到注释代码,您可以使用它来创建灰度滤镜。

之后,我所要做的就是对其进行测试和解析:

let image = UIImage(named: "Test2")!

let grayScale: [Bool] = image.pixelData.map {
    var white: CGFloat = 0
    var alpha: CGFloat = 0

    $0.color.getWhite(&white, alpha: &alpha)
    return white > 0.5
}

var trues  = 0
var falses = 0

grayScale.forEach {
    if $0 {
        trues += 1
    } else {
        falses += 1
    }
}

最后一步也可以转换为扩展。希望这会有所帮助!

【讨论】:

  • 如何从这个数组生成bmp文件
  • 您需要构建自己的位图格式,因为 Apple 并没有真正支持它。我建议您将其导出到png,因为无论如何它都支持更广泛的平台。更多关于标签的信息在这里en.wikipedia.org/wiki/BMP_file_format
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2020-11-26
  • 2012-03-11
  • 1970-01-01
  • 2016-09-16
  • 2022-09-28
  • 2019-12-03
相关资源
最近更新 更多