実現したいこと
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
data は UnsafeRawPointer なので、バイト列 ([UInt8]) で渡す必要がありそう。
そして、bitmapInfo にエンディアンとか、浮動小数店かどうかとか渡すと良いのでは。
16bitのデータでも、[UInt8]で扱わないとダメということになるでしょうか?
(それとも、そもそもこのメソッドは流用できない?)
すみません、bitmapInfoに渡すエンディアンや浮動小数点は具体的にはどのようなものでしょうか・・・?
うーん、というか、元のコードちゃんと動きます? こちらで試したら落ちるんですけど…。
また、「jpeg画像の表示は出来ました」とのことですが、元のコードって JPEG 対応してますか?
そして、そもそも [UInt16] のデータはどういう形式ですか?
以下の回答で記載されている通りのソースだと、Jpegから読み込んだデータ配列はCGImageにしてUIImageにも変換できました。
https://teratail.com/questions/103711
①:Jpeg画像読み込み。
②:画像データを[UInt8]の配列に変換。※RGBデータ
③:②の配列を「https://teratail.com/questions/103711」に載っている「RBGImage」メソッドでCGImageに変換。
④:③のCGImageをUIImageにして画像表示。
これをJpeg以外の各種画像データでも出来ないか試しています。
※swiftも画像処理も初めてなので変なこと書いてたらすみません。。。
バイトとビットの関係だから
let bytesPerPixel = bitsPerPixel / 8
じゃないかな?
たぶん16に変えなくていいよ
試してみたらそのままで画像になっていました!
お二方大変助かりました。。。

回答2件
あなたの回答
tips
プレビュー