ios – 如何逐个像素地创建图像

ios – 如何逐个像素地创建图像,第1张

概述我想在 swift 3中逐像素创建一个UI Image 我搜索过但找不到实际有效的代码 所以让我解释一下,我有一个带字符的数组 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, 我想在 swift 3中逐像素地创建一个UI Image

我搜索过但找不到实际有效的代码

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

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 – 如何逐个像素地创建图像所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1070765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存