如何逐个像素地创build图像

我想用swift 3逐像素地创build一个UIImage

我有search,但我找不到实际工作的代码

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

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

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

如果是x,那么像素的颜色是红色的

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

如果是v,那么像素的颜色是黑色的

我想从这些angular色创build一个图像,并将其存储在照片中

有什么想法吗??

感谢您的回答

您可以创build一个CGContext ,然后检索该图像的data缓冲区,然后用对应于您的string值的值填充该缓冲区:

 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万像素,则可能希望使此asynchronous,以避免阻塞主队列。

顺便说一下,以上使用这个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") }