2017-02-19 13 views
0

CGDataProvider関数とCGImage関数を使用して、OpenGL ESを使用してiOSで生成された図面をPNGファイルに保存しようとしています。 致命的なエラー:予期せぬことに、この行のオプション値をアンラッピングしている間に見つかりました:iOSスウィフト3でPNG画像ファイルにOpenGL ES図面を保存する

エラーがスローされましたが、コードがコンパイルされましたが実行時にエラーが発生しました。
let iref: CGImage = CGImage(pngDataProviderSource: provider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent)! 

コード:私はあなたがこのエラーを修正して助けてもらえスウィフト3.のためのウェブ上の任意のヘルプを見つけることができません

let x: Int = 0 
let y: Int = 0 
let dataLength: Int = Int(width) * Int(height) * 4 
let pixels: UnsafeMutableRawPointer? = malloc(dataLength * MemoryLayout<GLubyte>.size) 
glPixelStorei(GL_PACK_ALIGNMENT.ui, 4) 
glReadPixels(GLint(x), GLint(y), GLsizei(width), GLsizei(height), GLenum(GL_RGBA), GL_UNSIGNED_BYTE.ui, pixels) 
let pixelData: UnsafePointer = (UnsafeRawPointer(pixels)?.assumingMemoryBound(to: UInt8.self))! 
let cfdata: CFData = CFDataCreate(kCFAllocatorDefault, pixelData, dataLength * MemoryLayout<GLubyte>.size) 

let provider: CGDataProvider! = CGDataProvider(data: cfdata) 

let iref: CGImage = CGImage(pngDataProviderSource: provider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent)! 
UIGraphicsBeginImageContext(CGSize(width: CGFloat(width), height: CGFloat(height))) 
let cgcontext: CGContext? = UIGraphicsGetCurrentContext() 
cgcontext!.setBlendMode(CGBlendMode.copy) 
cgcontext!.draw(iref, in: CGRect(x: CGFloat(0.0), y: CGFloat(0.0), width: CGFloat(width), height: CGFloat(height))) 
let image: UIImage? = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

マチックOblakによって示唆されるように

+1

少なくとも1つがnilであることを確認します。 2つの力のアンラップを使用します。 1つはプロバイダー、もう1つはCGImage全体です。とにかくプロバイダの別のコンストラクタを試してみましょう:CGDataProvider(dataInfo:nil data:cfdata、size:size、releaseData:nil) –

+0

CGImage全体がnilになっています。 Nilは、期待される引数型 'CGDataProviderReleaseDataCallback'(別名@convention(c)(オプション、UnsafeRawPointer、Int) - >()と互換性がありません。このエラーメッセージで失敗します。 ') let provider = CGDataProvider(dataInfo:なしデータ:cfdata、サイズ:size、releaseData:なし) – acn

+1

ああ、私は今見ています。生のPNGデータを期待するCGImageのコンストラクタを使用していますが、生のRGBAデータがあります。使用した方法は、PNG画像のファイルの内容からのデータを期待しています。 CGImage(width :, height :, bitsPerComponent :, bitsPerPixel :, bytesPerRow :, space :, bitmapInfo :,プロバイダ:, decode :, shouldInterpolate :,インテント: –

答えて

0

、エラーが消えていたと私は上記のコードでは、この行この

let iref: CGImage? = CGImage(width: Int(width), height: Int(height), bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: Int(width)*4, space: colorspace!, bitmapInfo: CGBitmapInfo.byteOrder32Big, provider: provider, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent) 

新しい作業コードと

let iref: CGImage = CGImage(pngDataProviderSource: provider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent)! 

を交換したときにコードが、正常に働いていました:

let x: Int = 0 
let y: Int = 0 
let dataLength: Int = Int(width) * Int(height) * 4 
let pixels: UnsafeMutableRawPointer? = malloc(dataLength * MemoryLayout<GLubyte>.size) 
glPixelStorei(GL_PACK_ALIGNMENT.ui, 4) 
glReadPixels(GLint(x), GLint(y), GLsizei(width), GLsizei(height), GLenum(GL_RGBA), GL_UNSIGNED_BYTE.ui, pixels) 
let pixelData: UnsafePointer = (UnsafeRawPointer(pixels)?.assumingMemoryBound(to: UInt8.self))! 
let cfdata: CFData = CFDataCreate(kCFAllocatorDefault, pixelData, dataLength * MemoryLayout<GLubyte>.size) 

let provider: CGDataProvider! = CGDataProvider(data: cfdata) 

let iref: CGImage? = CGImage(width: Int(width), height: Int(height), bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: Int(width)*4, space: colorspace!, bitmapInfo: CGBitmapInfo.byteOrder32Big, provider: provider, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent) 
UIGraphicsBeginImageContext(CGSize(width: CGFloat(width), height: CGFloat(height))) 
let cgcontext: CGContext? = UIGraphicsGetCurrentContext() 
cgcontext!.setBlendMode(CGBlendMode.copy) 
cgcontext!.draw(iref, in: CGRect(x: CGFloat(0.0), y: CGFloat(0.0), width: CGFloat(width), height: CGFloat(height))) 
let image: UIImage? = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 
関連する問題