回答が入らないようなのでSwift4で申し訳ないですが。
swift
1func RBGImage(data: [UInt8], width: Int, height: Int) -> CGImage? {
2
3 let bitsPerComponent = 8
4 let numberOfComponents = 3
5 let bitsPerPixel = bitsPerComponent * numberOfComponents
6 let bytesPerPixel = bitsPerPixel / 8
7
8 guard width > 0, height > 0 else { return nil }
9 guard width * height * numberOfComponents == data.count else { return nil }
10
11 return CGDataProvider(dataInfo: nil, data: data, size: data.count) { _,_,_ in }
12 .flatMap {
13 CGImage(width: width,
14 height: height,
15 bitsPerComponent: bitsPerComponent,
16 bitsPerPixel: bitsPerPixel,
17 bytesPerRow: width * bytesPerPixel,
18 space: CGColorSpaceCreateDeviceRGB(),
19 bitmapInfo: [],
20 provider: $0,
21 decode: nil,
22 shouldInterpolate: false,
23 intent: .defaultIntent)
24 }
25}
これで動くようです。
引数について
bitmapInfo
与えるビットマップがどのような形式なのかをOptionSet
で指定します。
ビットマップといってもいろいろ形式があるのでどのようなビットマップなのかを示すものです。
OptionSet
というのは特殊な配列のようなものです。
与えられている値から0個から複数個の値を配列の形で与えます。
例えば[.alphaInfoMask, .byteOrderMask]
などです。
ビットフラグがわかるのならば、OptionSetというのはSwiftでのビットフラグといえばおわかりいただけると思います。
この例では何も指定しない[]
を与えています。
provider
CGDataProviderを与えます。
これを通してデータを与えるようになります。
単純な配列の場合は例のようにinit(dataInfo:data:size:releaseData:)
を使用します。
releaseData
はtrailing closureで与えています。が、何もしてません。
decode
component(RBG)の上限と下限を与えて結果の画像のカラースペースを制限するもののようです。
例では指定していません。
shouldInterpolate
補間を行うかどうかを指定します。
例では補間を行わないようにfalseを指定しています。
intent
画像と描画するgraphics context間のカラースペースの変換をどのように行うかを指定します。
例ではシステムに任せるdefaultIntent
を与えています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/12 09:14
2017/12/12 09:16