我搜索过但找不到实际有效的代码
所以让我解释一下,我有一个带字符的数组
var array = ["w","x","y","w","y"] //there will be like 26 millions of those
如果是w,则像素的颜色将为蓝色
如果它是x,则像素的颜色将为红色
如果是y,则像素的颜色为绿色
如果是v,则像素的颜色为黑色
我想从这些角色创建一个图像并将其存储在照片中
有什么想法吗??
谢谢你的回答
解决方法 您可以创建一个CGContext,然后检索该图像的数据缓冲区,然后使用与您的字符串值对应的值填充该缓冲区: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 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,Alpha: 255) static let green = RGBA32(red: 0,green: 255,Alpha: 255) static let blue = RGBA32(red: 0,blue: 255,Alpha: 255)}
要保存图像,您可以执行以下 *** 作:
createImage(wIDth: wIDth,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 – 如何逐个像素地创建图像全部内容,希望文章能够帮你解决ios – 如何逐个像素地创建图像所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)