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

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

ただいまの
回答率

90.76%

  • Swift

    6722questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 479

maru.wk

score 22

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

let 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です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

回答が入らないようなのでSwift4で申し訳ないですが。

func RBGImage(data: [UInt8], width: Int, height: Int) -> CGImage? {

    let bitsPerComponent = 8
    let numberOfComponents = 3
    let bitsPerPixel = bitsPerComponent * numberOfComponents
    let bytesPerPixel = bitsPerPixel / 8

    guard width > 0, height > 0 else { return nil }
    guard width * height * numberOfComponents == data.count else { return nil }

    return CGDataProvider(dataInfo: nil, data: data, size: data.count) { _,_,_ in }
        .flatMap {
            CGImage(width: width,
                    height: height,
                    bitsPerComponent: bitsPerComponent,
                    bitsPerPixel: bitsPerPixel,
                    bytesPerRow: width * bytesPerPixel,
                    space: CGColorSpaceCreateDeviceRGB(),
                    bitmapInfo: [],
                    provider: $0,
                    decode: nil,
                    shouldInterpolate: false,
                    intent: .defaultIntent)
    }
}

これで動くようです。


 引数について

 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 18:14

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

    キャンセル

  • 2017/12/12 18:16

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

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6722questions

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