gpt4 book ai didi

ios - 如何逐像素创建图像

转载 作者:可可西里 更新时间:2023-11-01 04:33:11 25 4
gpt4 key购买 nike

我想在 swift 3 中逐像素创建一个 UIImage

我搜索过但找不到真正有效的代码

所以让我解释一下,我有一个包含字符的数组

var array = ["w", "x", "y", "x", "y", "y", "y", "x", "x", "x", "w", "x", "y", "w", "y"] //there will be like 26 millions of those

如果是w,像素的颜色将为蓝色

如果是x,像素的颜色会是红色

如果是y,像素的颜色将为绿色

如果是v,像素的颜色将为黑色

我想用这些字符创建图像并将其存储在照片中

有什么想法吗??

感谢您的回答

最佳答案

您可以创建一个 CGContext,然后检索该图像的 data 缓冲区,然后用与您的字符串值相对应的值填充该缓冲区:

func createImage(width: Int, height: Int, from array: [String], completionHandler: @escaping (UIImage?, String?) -> Void) {
DispatchQueue.global(qos: .utility).async {
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bytesPerPixel = 4
let bitsPerComponent = 8
let bytesPerRow = bytesPerPixel * width
let bitmapInfo = RGBA32.bitmapInfo

guard array.count == width * height else {
completionHandler(nil, "Array size \(array.count) is incorrect given dimensions \(width) x \(height)")
return
}

guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo) else {
completionHandler(nil, "unable to create context")
return
}

guard let buffer = context.data else {
completionHandler(nil, "unable to get context data")
return
}

let pixelBuffer = buffer.bindMemory(to: RGBA32.self, capacity: width * height)

for (index, string) in array.enumerated() {
switch string {
case "w": pixelBuffer[index] = .blue
case "x": pixelBuffer[index] = .red
case "y": pixelBuffer[index] = .green
case "v": pixelBuffer[index] = .black
default: completionHandler(nil, "Unexpected value: \(string)"); return
}
}

let cgImage = context.makeImage()!

let image = UIImage(cgImage: cgImage)

// or
//
// let image = UIImage(cgImage: cgImage, scale: UIScreen.main.scale, orientation: .up)

completionHandler(image, nil)
}

}

如果有 2600 万像素,您可能希望使其异步以避免阻塞主队列。

顺便说一句,上面使用了这个struct:

struct RGBA32: Equatable {
private var color: UInt32

var redComponent: UInt8 {
return UInt8((color >> 24) & 255)
}

var greenComponent: UInt8 {
return UInt8((color >> 16) & 255)
}

var blueComponent: UInt8 {
return UInt8((color >> 8) & 255)
}

var alphaComponent: UInt8 {
return UInt8((color >> 0) & 255)
}

init(red: UInt8, green: UInt8, blue: UInt8, alpha: UInt8) {
color = (UInt32(red) << 24) | (UInt32(green) << 16) | (UInt32(blue) << 8) | (UInt32(alpha) << 0)
}

static let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.byteOrder32Little.rawValue

static func ==(lhs: RGBA32, rhs: RGBA32) -> Bool {
return lhs.color == rhs.color
}

static let black = RGBA32(red: 0, green: 0, blue: 0, alpha: 255)
static let red = RGBA32(red: 255, green: 0, blue: 0, alpha: 255)
static let green = RGBA32(red: 0, green: 255, blue: 0, alpha: 255)
static let blue = RGBA32(red: 0, green: 0, blue: 255, alpha: 255)
}

要保存图像,您可以:

createImage(width: width, height: height, from: array) { image, errorMessage in
guard let image = image, errorMessage == nil else {
print(errorMessage!)
return
}

DispatchQueue.main.async {
self.imageView.image = image
UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil)
}
}

在哪里

func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: Any?) {
guard error == nil else {
print(error!.localizedDescription)
return
}

print("image saved")
}

关于ios - 如何逐像素创建图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40205830/

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