从像素数组问题中获取 NSImage (Swift)

Posted

技术标签:

【中文标题】从像素数组问题中获取 NSImage (Swift)【英文标题】:Obtain NSImage from Pixel Array Problems (Swift) 【发布时间】:2016-11-30 03:04:15 【问题描述】:

L.E:我找到了问题,现在它不再崩溃了,但现在(新问题)它没有按应有的方式绘制图像..它已损坏...

我有一个像素数组,需要先转换为 CGImage,然后再转换为 NSImage。我已经尝试过在 ios 上使用此版本的代码来获取 aUIImage,但我收到了一个我无法处理的错误:CGImageCreate: invalid image bits/pixel or bytes/row。 致命错误:在展开可选值时意外发现 nil

任何想法,任何帮助将不胜感激!谢谢!我把代码放在这里:

 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)

【问题讨论】:

请注意,这不是重复的,因为我需要在 osx 而不是 ios 上开发,而且我没有使用 RGB 结构。 请注意,答案中的代码首先创建了一个 CGImage,它应该适用于 OS X 和 iOS。您可以将 RGB 结构数组替换为像素数据数组。 这个方法我试过了,可惜崩溃了…… 然后更新您的问题并显示您尝试过的内容、崩溃的位置/方式等。 您指出的代码完全相同,唯一的例外是原始像素参数。这就是为什么我需要这个问题仍然悬而未决... 【参考方案1】:

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

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)

见代码中的 cmets。

【讨论】:

以上是关于从像素数组问题中获取 NSImage (Swift)的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将 NSImage 放置在透明画布上

旋转、改变颜色并从 NSImage 获取 RGB565 数据

Re: 快速从 UIImage/CGImage 获取像素数据作为数组

在swift中从UIImage / CGImage获取像素数据作为数组

Swift NSImage到CGImage

如何从 NSImage/UIImage 获取 AVFrame(ffmpeg)