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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

244閲覧

Kotlin(Android)でアルファ無しのデータ(RGB、各チャンネル16bitデータ)をBitmap画像として表示したい

ykudo0403

総合スコア4

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2024/09/20 04:10

実現したいこと

RGBデータ(各チャンネル16bit、UShort型データ)を、KotlinでBitmap画像として表示したいです。

ネットを調べたところ「ARGB_8888」を使ってBitmap画像化するサンプルはいくつか見つけられているのですが、「RGBA_F16」を使ってBitmap画像化するサンプルが見つけられないので。。。

発生している問題・分からないこと

以下のURLで8bitRGBデータ(各チャンネル8bit、UByte型データ(0~255))を、「Bitmap.Config.ARGB_8888」を使ってBitmap画像化はできました。
https://teratail.com/questions/8xn0l7z08egxs0

上記と同じ様なやり方で、RGBデータ(各チャンネル16bit、UShort型データ(0~65535))を使って、「Bitmap.Config.RGBA_F16」を指定すれば出来るかと思ったのですが、「Unsupported bitmap configuration: "RGBA_F16"」と表示されてしまいます。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

以下のURLで8bitRGBデータ(各チャンネル8bit、UByte型データ(0~255))を、「Bitmap.Config.ARGB_8888」を使ってBitmap画像化はできました。
https://teratail.com/questions/8xn0l7z08egxs0

補足

特になし

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

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

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

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

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

guest

回答1

0

ベストアンサー

「発生している問題・分からないこと」より引用:

上記と同じ様なやり方で、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つが考えられます。

  1. RGBの3画素、アルファ値を16ビットの半精度浮動小数点数に自力で直し、例えばBitmap.copyPixelsFromBufferを利用してBitmapオブジェクトを生成する
  2. RGBの3画素、アルファ値をColorクラスのargbメソッドで扱えるような形に減色し、setPixelメソッドで各座標の画素を描いていく

2.のsetPixelを使った方法については、以下のようなコードでBitmap.Config.RGBA_F16Bitmapオブジェクトが生成できます。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 01:57

dodox86

総合スコア9254

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

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

ykudo0403

2024/09/24 08:16

詳しい解説ありがとうございます! 詳しい方にも聞いたところ、そもそもAndroid端末ではおっしゃる通り16bitデータ画像に対応する端末自体がそもそも無いらしく、出来ないのが普通ということでした。 細かい内容は長くなってしまうらしいので省かれたのですが、macOSやiOS(iPhone)のswiftのCGImageを使用する場合に出来ているのは、AppleはOSからハードまで自前で用意できているから対応している、ということでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問