これが重複している場合はまず申し訳ありません。私の質問に答える主題が見つかりませんでした。
32 ビット浮動小数点値を short int (16 ビット) および unsigned char (8 ビット) 値に変換するために使用される小さなプログラムをコーディングしています。これは HDR 画像用です。
ここから、次の関数を取得できます(クランプなし):
static inline uint8_t u8fromfloat(float x)
{
return (int)(x * 255.0f);
}
同じように、(pow( 2,16 ) -1)
しかし、その後、順序付けられたディザリング、特にベイヤー ディザリングについて考えるようになりました。uint8_t に変換するには、unsigned short に 4x4 マトリックスと 8x8 マトリックスを使用できると思います。
また、この方法でプロセスを高速化するためのルックアップ テーブルも考えました。
uint16_t LUT[0x10000] // 2¹⁶ values contained
float に対応する 2^16 の unsigned short 値を格納します。unsigned short ↔ unsigned int の間の暗黙的なキャストのため、この同じテーブルを uint8_t にも使用できます。
しかし、このようなルックアップ テーブルはメモリが膨大になるのではないでしょうか? また、このようなテーブルをどのように埋めますか?!
今、私は混乱しています、あなたによると何が最善でしょうか?
uwind 回答後の編集: U8/U16 に変換する前に、同時に基本的な色空間変換も行いたいとしましょう。 . その場合、LUT を使用した方が効率的ではないでしょうか。そして、ええ、LUTのインデックス作成にはまだ問題があります。