質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

5832閲覧

Swift RGB値の配列からCGImageを作成するやり方

maru.wk

総合スコア30

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/12/07 08:05

編集2017/12/07 08:07

Swift初心者です。
画像のRGB値の配列から,CGImageを作成したいのですが,そのやり方がわかりません。インターネットで検索したところ,以下のやり方を見つけました。

swift

1let cgimage = CGImage(width: <#T##Int#>, height: <#T##Int#>, bitsPerComponent: <#T##Int#>, bitsPerPixel: <#T##Int#>, bytesPerRow: <#T##Int#>, space: <#T##CGColorSpace#>, bitmapInfo: <#T##CGBitmapInfo#>, provider: <#T##CGDataProvider#>, decode: <#T##UnsafePointer<CGFloat>?#>, shouldInterpolate: <#T##Bool#>, intent: <#T##CGColorRenderingIntent#>)

上の< >の中に適した値を入れれば作成できるとは思うのですが,何にどんな値を入れれば良いのか,特にbitmapinfo以降がわかりません。spaceまでは良かったのですが,,

必要な型はネットで検索し,Appleリファレンスも読んだのですが,全く理解不能でした。

今手元にある情報としては,RGBの配列,画像のwidthとheightです。
どなたかどうすればRGB値の配列から画像を作れるのか,何か他にもっと良いやり方があれば申し訳ありませんがご教授よろしくお願いします。

開発環境はswift3です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

回答が入らないようなので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/11 14:49

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maru.wk

2017/12/12 09:14

ご回答ありがとうございました。正直手も足も出ない状態であったので,本当に助かりました。また,サンプルコードまで添付いただき,感謝しても仕切れません。
maru.wk

2017/12/12 09:16

一つ質問があるのですが, bitsPerPixelが3であるのは,RGB情報のみの配列であるからで,ここにαの情報も加えるとすると,4となる,という解釈で間違えないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問