在Swift中将UIImage转换为UInt8数组

时间:2016-04-05 03:53:49

标签: ios arrays swift image

所有!

我一直在对此进行大量研究,并且已经将几种不同的解决方案集成到我的项目中,但它们似乎都没有效果。我目前的解决方案是从this thread借来的。

然而,当我运行我的代码时,会发生两件事:

  1. 像素阵列保持初始化但未填充(全0)
  2. 我收到两个错误:

    CGBitmapContextCreate:不支持的参数组合:设置CGBITMAP_CONTEXT_LOG_ERRORS环境变量以查看详细信息

  3. CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set 
    

    有什么想法吗?这是我当前构建的函数,我正在调用我的Image类:

    init?(fromImage image: UIImage!) {
        let imageRef = image!.CGImage
        self.width = CGImageGetWidth(imageRef)
        self.height = CGImageGetHeight(imageRef)
        let colorspace = CGColorSpaceCreateDeviceRGB()
        let bytesPerRow = (4 * width);
        let bitsPerComponent :UInt = 8
        let pixels = UnsafeMutablePointer<UInt8>(malloc(width*height*4))
    
        var context = CGBitmapContextCreate(pixels, width, height, Int(bitsPerComponent), bytesPerRow, colorspace, 0);
    
        CGContextDrawImage(context, CGRectMake(0, 0, CGFloat(width), CGFloat(height)), imageRef)
    

    任何指针都会有很大的帮助,因为我很了解所有这些CGBitmap的工作原理。

    非常感谢!

2 个答案:

答案 0 :(得分:4)

您不应将0作为bitmapInfo的{​​{1}}参数传递给CGBitmapContextCreate。对于RGBA,您应该通过CGImageAlphaInfo.PremultipliedLast.rawValue

可在此处找到bitsPerComponentbytesPerRowcolorspacebitmapInfo的支持组合:  https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-BCIBHHBB

请注意每像素32位(bpp) 每像素4个字节,您可以用它来计算bytesPerRow < / p>

答案 1 :(得分:-1)

您需要将图像转换为NSData,然后转换NSData 到UInt8数组。

let data: NSData = UIImagePNGRepresentation(image)

// or let data: NSData = UIImageJPGRepresentation(image)

let count = data.length / sizeof(UInt8)

// create an array of Uint8
var array = [UInt8](count: count, repeatedValue: 0)

// copy bytes into array
data.getBytes(&array, length:count * sizeof(UInt8))