所有!
我一直在对此进行大量研究,并且已经将几种不同的解决方案集成到我的项目中,但它们似乎都没有效果。我目前的解决方案是从this thread借来的。
然而,当我运行我的代码时,会发生两件事:
我收到两个错误:
CGBitmapContextCreate:不支持的参数组合:设置CGBITMAP_CONTEXT_LOG_ERRORS环境变量以查看详细信息
和
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的工作原理。
非常感谢!
答案 0 :(得分:4)
您不应将0
作为bitmapInfo
的{{1}}参数传递给CGBitmapContextCreate
。对于RGBA,您应该通过CGImageAlphaInfo.PremultipliedLast.rawValue
。
可在此处找到bitsPerComponent
,bytesPerRow
,colorspace
和bitmapInfo
的支持组合:
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))