「発生している問題・分からないこと」より引用:
上記と同じ様なやり方で、RGBデータ(各チャンネル16bit、UShort型データ(0~65535))を使って、「Bitmap.Config.RGBA_F16」を指定すれば出来るかと思ったのですが、「Unsupported bitmap configuration: "RGBA_F16"」と表示されてしまいます。
質問文中にソースコードの提示が無いので、どのようなコードを書いて実行したら当該エラー(何かのException?)が表示されたのか詳しくは分かりませんが、Bitmap.Config.RGBA_F16
のリファレンス
Bitmap.Config.RGBA_F16 - Android Developer
を見ると、以下のように説明があります。
Each pixel is stored on 8 bytes. Each channel (RGB and alpha for translucency) is stored as a half-precision floating point value. This configuration is particularly suited for wide-gamut and HDR content.
When accessing directly via #copyPixelsFromBuffer or #copyPixelsToBuffer, use this formula to pack into 64 bits:
long color = (A & 0xffff) << 48 | (B & 0xffff) << 32 | (G & 0xffff) << 16 | (R & 0xffff);
意訳すると「RGBの各3色とアルファ値は、それぞれ16ビットの半精度浮動小数点数(half-precision floating point value)で格納される。Wide-GamutやHDRのような広い色域のコンテンツに適す」とのことです。
半精度浮動小数点数 - Wikipedia
質問者ykudo0403さんが使おうとした元のデータ(RGB各チャンネル16bit、UShort型データ)のフォーマットの詳細がどういうものか分からず、分かったとしても広い色域を表示できるデバイスを当方は持っていなくて再現できないので推測ですが、エラーは、別の形式の各画素16ビットの画像データを使っている為に出ているのではないでしょうか。
対応する方法としては少なくとも以下の2つが考えられます。
- RGBの3画素、アルファ値を16ビットの半精度浮動小数点数に自力で直し、例えばBitmap.copyPixelsFromBufferを利用して
Bitmap
オブジェクトを生成する
- RGBの3画素、アルファ値をColorクラスのargbメソッドで扱えるような形に減色し、setPixelメソッドで各座標の画素を描いていく
2.のsetPixel
を使った方法については、以下のようなコードでBitmap.Config.RGBA_F16
のBitmap
オブジェクトが生成できます。MicrosoftのCopilotに提案されたコードですが、当方で実際に確認したところPixel 2/API 30対応のエミュレーター上で実行したテスト用アプリのImageView
にて表示できました。
Kotlin
1 fun manipulateBitmap1(): Bitmap {
2 // Create a bitmap with RGBA_F16 configuration
3 val width = 100
4 val height = 100
5 val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGBA_F16)
6
7 // Manipulate the pixels
8 for (x in 0 until width) {
9 for (y in 0 until height) {
10 // Example: Set pixel to a semi-transparent red color
11 val color = Color.argb(128, 255, 0, 0)
12 bitmap.setPixel(x, y, color)
13 }
14 }
15
16 // The bitmap is now manipulated and can be used as needed
17 return bitmap;
18 }
上記コードを応用して書いたテストアプリで試した結果の画像を添付します。透過無しで、RGB各画素256諧調で表示できています。
しかしながらこのコードをベースにしたものではBitmap.Config.RGBA_F16
を使っていても実質Bitmap.Config.RGBA_8888
と同等だと思うので、あまり意味が無いとは思います。減色して表示しても製品として問題無いのであれば検討の余地はあるかもしれません。
元となるデータの各色が本当に8ビット、256階調を超える値になっているのであれば、やはり16ビットの半精度浮動小数点数に直し、適切にBitmap.Config.RGBA_F16
用のデータフォーマットに変換して使うべきなのでしょう。前に挙げたWikipediaの記事の「出典」にて以下の記載があります。
macOSではMac OS X v10.4以降にて、RGBA各チャンネルが16ビット浮動小数点数(ピクセルあたり64ビット)のピクセルフォーマットkCIFormatRGBAhがサポートされている[12]。
kCIFormatRGBAh - Apple Developer Documentation
元のデータの形式を再確認してみると共に、変換の方法を再度検討してみてください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/09/24 08:16