すべてのピクセルのデータが赤 1 バイト、緑 1 バイト、青 1 バイトです。これを 8 ビットのビットマップにパックする必要があるため、ピクセルには 1 バイトしかありません。ビットマップ形式の rgb (3 バイト) を 1 バイトに変換する方法は? (私は C++ を使用しており、外部ライブラリを使用できません)
3 に答える
ビットマップ構造を形成する方法を誤解していると思います。(どういうわけか) 3 バイトを 1 つにパックする必要はありません。結局のところ、情報を捨てない限り(特別な画像フォーマット GL_R3_G3_B2を使用するなど)、それは不可能です。
BMP ファイル形式のwiki ページには、詳細な BMP 形式が示されています。これはヘッダーであり、その後にデータが続きます。ヘッダーに設定した内容に応じて、各コンポーネントが 1 バイトである RBG データ コンポーネントを含む BMP イメージを形成できます。
まず、各色に割り当てるビット数を決定する必要があります。
色ごとに 3 ビットで 1 バイト (9 ビット) オーバーフローします。
色ごとに 2 ビットがアンダーフローします。
3 バイトの RGB ビットマップでは、各色の強度を表す 1 バイトがあります。0 が最小で、255 が最大強度です。それを 1 バイトのビットマップに変換する場合 (色ごとに 2 ビットを選択すると仮定)、変換は次のようになります。
1-byte red color/64
つまり、色ごとに 265 の色合いのスペクトルから 4 つの色合いしか得られません。
最初に、ソース イメージに最適な 256 色のパレットを作成する必要があります。
次に、生成したパレットを使用して画像をディザリングする必要があります。
どちらの問題にも、多くのよく知られた解決策があります。ただし、完全に自動で高品質の結果を生成することは不可能です。異なるソース画像に対して、異なるアプローチが最適です。たとえば、プロセスのパラメーターを調整する Photoshop UI は次のとおりです。