从像素数组问题中获取NSImage(SWIFT) [英] Obtain NSImage from Pixel Array Problems (Swift)

查看:0
本文介绍了从像素数组问题中获取NSImage(SWIFT)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经找到问题了,现在它不再崩溃了,但现在(新一期)它没有画出它应该画的图像。它已损坏...

我有一个像素数组,需要先转换为CGImage,然后再转换为NSImage。我已经尝试了iOS上用于获取aUIImage的代码的这个版本,但我收到了一个错误,我无法处理:CGImageCreate:无效的图像位/像素或字节/行。 致命错误:展开可选值时意外发现空

任何想法,任何帮助都将受到真诚的感谢!谢谢!我将把代码放在这里:

 func imageFromPixels(image : CGImage, size:NSSize,pixels: UnsafeMutablePointer<UInt8>, width: Int, height: Int)-> NSImage {
    let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue)
   let bitsPerComponent = CGImageGetBitsPerComponent(image)
    let bitsPerPixel = CGImageGetBitsPerPixel(image)
    let bytesPerRow = CGImageGetBytesPerRow(image)
    var data = pixels
    let providerRef = CGDataProviderCreateWithCFData(
        NSData(bytes: &data, length: height * width  * sizeof(UInt8))
    )

    let cgim = CGImageCreate(
        width,
        height,
        bitsPerComponent,
        bitsPerPixel,
        bitsPerRow,
        rgbColorSpace,
        bitmapInfo,
        providerRef,
        nil,
        true,
        .RenderingIntentDefault
    )
    return NSImage(CGImage: cgim!, size: size)
}

推荐答案

您的新代码比旧代码有更多错误,因此需要进行一些修复:

func imageFromPixels(size: NSSize, pixels: UnsafePointer<UInt8>, width: Int, height: Int)-> NSImage { //No need to pass another CGImage
    let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue)
    let bitsPerComponent = 8 //number of bits in UInt8
    let bitsPerPixel = 4 * bitsPerComponent //ARGB uses 4 components
    let bytesPerRow = bitsPerPixel * width / 8 // bitsPerRow / 8 (in some cases, you need some paddings)
    let providerRef = CGDataProviderCreateWithCFData(
        NSData(bytes: pixels, length: height * bytesPerRow) //Do not put `&` as pixels is already an `UnsafePointer`
    )

    let cgim = CGImageCreate(
        width,
        height,
        bitsPerComponent,
        bitsPerPixel,
        bytesPerRow, //->not bits
        rgbColorSpace,
        bitmapInfo,
        providerRef,
        nil,
        true,
        .RenderingIntentDefault
    )
    return NSImage(CGImage: cgim!, size: size)
}

请参阅代码中的注释。

这篇关于从像素数组问题中获取NSImage(SWIFT)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆