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
の値、といった感じです。