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

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

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

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

Q&A

解決済

2回答

552閲覧

Swift RGB値の配列(16bit)からCGImageを生成したい。

ykudo0403

総合スコア2

Swift

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

0グッド

0クリップ

投稿2023/03/31 01:09

編集2023/03/31 01:11

実現したいこと

16bitのRGB画像データを元に、CGImageなどで画像をiOS上で表示したい。

前提

画像の扱いは初心者のため、知識などが無い状態です。
以下の質問の回答で8bitのjpeg画像の表示は出来ました。
https://teratail.com/questions/103711

16bitのRaw画像や、他bitの画像をCGImageにするには、どこを変更すれば良いでしょうか?

発生している問題・エラーメッセージ

16bitの画像データを使用する時は、[UInt8]ではなく[UInt16]にし、
8となっている部分を16ビットに変更しましたが、nilが返却されてしまいました。

該当のソースコード

Swift

1func RBGImage(data: [UInt16], width: Int, height: Int) -> CGImage? { 2 3 let bitsPerComponent = 16 4 let numberOfComponents = 3 5 let bitsPerPixel = bitsPerComponent * numberOfComponents 6 let bytesPerPixel = bitsPerPixel / 16 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}

試したこと

上記にも記載した通り、以下のURLのソースの一部を16に変更しています。
https://teratail.com/questions/103711

補足情報(FW/ツールのバージョンなど)

XCode 14.2

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

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

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

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

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

hoshi-takanori

2023/03/31 03:12

data は UnsafeRawPointer なので、バイト列 ([UInt8]) で渡す必要がありそう。 そして、bitmapInfo にエンディアンとか、浮動小数店かどうかとか渡すと良いのでは。
ykudo0403

2023/03/31 03:58

16bitのデータでも、[UInt8]で扱わないとダメということになるでしょうか? (それとも、そもそもこのメソッドは流用できない?) すみません、bitmapInfoに渡すエンディアンや浮動小数点は具体的にはどのようなものでしょうか・・・?
hoshi-takanori

2023/03/31 04:12

うーん、というか、元のコードちゃんと動きます? こちらで試したら落ちるんですけど…。 また、「jpeg画像の表示は出来ました」とのことですが、元のコードって JPEG 対応してますか? そして、そもそも [UInt16] のデータはどういう形式ですか?
ykudo0403

2023/03/31 04:47

以下の回答で記載されている通りのソースだと、Jpegから読み込んだデータ配列はCGImageにしてUIImageにも変換できました。 https://teratail.com/questions/103711 ①:Jpeg画像読み込み。 ②:画像データを[UInt8]の配列に変換。※RGBデータ ③:②の配列を「https://teratail.com/questions/103711」に載っている「RBGImage」メソッドでCGImageに変換。 ④:③のCGImageをUIImageにして画像表示。 これをJpeg以外の各種画像データでも出来ないか試しています。 ※swiftも画像処理も初めてなので変なこと書いてたらすみません。。。
MasakiHori

2023/03/31 08:34

バイトとビットの関係だから let bytesPerPixel = bitsPerPixel / 8 じゃないかな? たぶん16に変えなくていいよ
ykudo0403

2023/04/04 06:32

試してみたらそのままで画像になっていました! お二方大変助かりました。。。
guest

回答2

0

解決方法にも載せておきます。

let bitsPerComponent = 16  ※そのまま
let bytesPerPixel = bitsPerPixel / 16 ⇒ let bytesPerPixel = bitsPerPixel / 8

bitmapInfo: [] ⇒ bitmapInfo: CGBitmapInfo(rawValue: CGImageAphaInfo.none.rawValue | CGImageByteOrderInfo.order16Little.rawValue)
※画像にAlpha(透過)が含まれていないため。ある場合はAlpha(透過)の位置を別途指定する必要あり(first、last)

投稿2023/04/27 02:26

ykudo0403

総合スコア2

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

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

0

自己解決

MasakiHoriさんの言う通り特に変えずにデータを変換することができました!
自己解決で閉じさせていただきます。

投稿2023/04/04 06:34

ykudo0403

総合スコア2

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

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

MasakiHori

2023/04/04 10:04

僕が示した let bytesPerPixel = bitsPerPixel / 8 の部分だけ8にしたということですか?それとも let bitsPerComponent = 16 の部分も8にしたということですか? 解決した手段を書いてベストアンサーにしてください。 あなた以外にも解決策を探している人がいるかもしれません。
ykudo0403

2023/04/27 02:26

遅れて申し訳ありません、以下にすることで16bitRGBデータを画像に変換できました。 let bitsPerComponent = 16  ※そのまま let bytesPerPixel = bitsPerPixel / 16 ⇒ let bytesPerPixel = bitsPerPixel / 8 bitmapInfo: [] ⇒ bitmapInfo: CGBitmapInfo(rawValue: CGImageAphaInfo.none.rawValue | CGImageByteOrderInfo.order16Little.rawValue) ※画像にAlpha(透過)が含まれていないため。ある場合はAlpha(透過)の位置を別途指定する必要あり(first、last)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問