UIImage の画像は作りやすいです。適当に例えば UIImage(named: "SomeImage.png") で書けばとりあえず iOS や OS X で使う画像データをつくれます。ところが、時には画像そのものでなく。画像の中身のデータ、すなわち画素データを配列で欲しい時もあったりします。例えば画像解析する時とかですね。では、画素データをどうすれば取得できるでしょうか?結構いろいろググってみたけどなかなか最適解が見当たらなかったのですけど、一番手取り早く簡単かつ速い方法ですと下記のような感じですかね
func getByteArrayFromImage(imageRef: CGImageRef) -> [UInt8] {
let data = CGDataProviderCopyData(CGImageGetDataProvider(imageRef))
let length = CFDataGetLength(data)
var rawData = [UInt8](count: length, repeatedValue: 0)
CFDataGetBytes(data, CFRange(location: 0, length: length), &rawData)
return rawData
}
上記の方法ですと、CGImageRef データを渡せば [UInt8] 形式で画素データを渡してくれます。CGImageRef は基本 UIImageObject.CGImage で取得できるので簡単です。あとは画像データと同じ大きさな仮の配列 rawData を用意すれば CFDataGetBytes で画像データを rawData に転送できます。C言語で言う memcpy と同じような動作(多分)なので for 文を回す必要がなく、NSData になおして一個ずつバイトデータを配列に書き込むより遥かに速いはずです。使い方は下記のように使えば OK です:
let imageRef = UIImage(named: "SomeImage.png")!.CGImage!
let imageData = getByteArrayFromImage(imageRef)
これで imageData と言う [UInt8] の配列が得られますので、あとはどのようにそのデータを使って解析するかだけです。
ちなみに、得られた imageData は、RGBA の順番でピクセルを表しています。つまり imageData[0] は 1 つ目のピクセルの red の値、imageData[1] は 1 つ目のピクセルの green の値、……そして imageData[4] は 2 つ目のピクセルの red の値、といった感じです。