2016-07-26 47 views
1

LE:我发现了这个问题,现在它不会崩溃了,但现在(新问题)它不会像应该那样绘制图像。 ...从像素阵列问题获取NSImage(Swift)

我有一个像素数组,我需要变成一个CGImage,然后进入NSImage。我试过这个版本的代码用于获取iUIImage的ios,我得到一个我无法处理的错误: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) 
} 
+0

请注意,这不是重复的,因为我需要在osx上开发,而不是ios,因为我没有使用RGB结构。 –

+0

请注意,答案中的代码首先创建一个CGImage,并且应该可以在OS X和iOS上使用。您可以用一组像素数据替换RGB结构数组。 –

+0

我试过这种方法,不幸的是它崩溃了... –

回答

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) 
} 

参见代码中的注释。