gpt4 book ai didi

ios - 将 UIImage 转换为单色 1 位 bmp 图像 Swift 5.1

转载 作者:行者123 更新时间:2023-11-28 13:24:09 25 4
gpt4 key购买 nike

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
}
}

最佳答案

我已经创建了一个解决方案,也许有点牵强。

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

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
}
}

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

关于ios - 将 UIImage 转换为单色 1 位 bmp 图像 Swift 5.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58670735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com