2016-04-05 34 views
3

すべて!UIImageをSwiftのUInt8配列に変換する

私はこれについて多くの研究をしてきました。私はいくつかの異なるソリューションを自分のプロジェクトに統合しましたが、どれも動作していないようです。私の現在の解決策はthis threadから借りています。

私は私のコードを実行すると、しかし、二つのことが起こる:

  1. を画素配列は、(0の完全な)初期化されたが、未実装のまま
  2. 私は2つのエラーを取得:

    CGBitmapContextCreate:サポートされていないがパラメータの組み合わせ:詳細を見るにはCGBITMAP_CONTEXT_LOG_ERRORS環境変数を設定してください。

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

私はこのCGBitmapのもののすべてがどのように機能するかを理解するに新たなんだと

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) 

任意のポインタは、大いに役立つでしょう:ここで私は私のImageクラスのために呼んでいる私の現在構築された機能です。

ありがとうございます!

+0

最初のステップは、暗黙のうちにアンラップされたものを削除し、アンラップされた 'Optional'を強制することです。彼らはただランタイムのクラッシュとエラーを求めています。 'Optional'をチェックし、それぞれのケースを適切に処理するほうがずっと良いです。 – ColGraff

+1

素晴らしい点。私はすぐにそれに着きます。 –

答えて

4

あなたはCGBitmapContextCreateためbitmapInfoのparamとして0を渡すべきではありません。 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


+0

これは、正しく配置されているかどうかはわかりませんが、配列が取り込まれるのを確実に助けました。私はそれをすぐに画像に変換すると、チャンネルは非常に混乱しているようです。ここでこれを続けるか別の質問をしてください。 –

-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)) 
+2

これは、生のピクセルデータではなくPNG表現を提供します。 –

+1

@MartinRが述べたように、この答えは明らかに間違っています。 – Emiswelt

関連する問題