-3

これは 1 つの大きな頭痛の種でした。私はすべてをグーグルで検索しましたが、ほとんど見つかりませんでした.Unicodeについての知識はほとんどなく、検索から少し学びました. 私が必要としているのは本当にシンプルですよね?私が使用している構造体には COLOR16 が必要です。

だから私は 0x0000 と 0x00FF が 0 から 255 であることを知っています。これは COLOR16 には役に立ちません。

4 つのゼロは、それぞれ 0 から 15 を表すことができます。

COLOR16 が 16^4 色すべてを表すことはわかっています。

しかし、私の人生では、たとえば (R:100; G:35; B:42) を Unicode 値に変換する方法を理解することはできません。

これに関する情報やチュートリアルなどを実際に使用できます。

ありがとう。

4

3 に答える 3

7

私はあなたが探しているものを知っています。あなたは間違った方法で尋ねているだけです。shortUnicode値ではなく、値を意味します。これの通称は RGB565 です。つまり、赤は 5 ビット、緑は 6 ビット、青は 5 ビットです。

これは 16 ビットになります。次のようにビットをパックします。

unsigned short val = ((r<<8) & 0xf800) | ((g<<3) & 0x07e0) | (b>>3);

ビットは次のようになります。

R  00000000 12345xxx  ->  12345000 00000000  (shift left by 8 and masked)
G  00000000 123456xx  ->  00000123 45600000  (shift left by 3 and masked)
B  00000000 12345xxx  ->  00000000 00012345  (shift right by 3, no mask required)

明らかに、このプロセスで情報が失われます。色の最も重要なビットを取り、それを使用しているだけです。非可逆圧縮に似ていますが、色の定義が失われていることに気付かない場合は、ビデオにはかなり適しています。緑が余分なビットを得る理由は、人間の目はそのスペクトルの色により敏感だからです.

于 2013-09-19T22:19:16.717 に答える
1

最後に、解決策が含まれているランダムな例が見つかりました。これは COLORREF を取り、TRIVERTEX 構造体の 16 ビット カラーを抽出します。

vertex[1].Red = GetRValue(clrStart)<<8; vertex[1].Green = GetGValue(clrStart)<<8; vertex[1].Blue = GetBValue(clrStart)<<8;

于 2013-09-21T14:53:42.413 に答える