ページ 11

フルカラーから256色に変換

Posted: 2009年3月18日(水) 10:27
by あbc
C++、コンパイラ6.0,ウィンドウズです。

RGB値のフルカラーの(12,13,255)の色を256色の近い色に変換したいのですが、いい方法が思いつきません。
どなたか、お願いします。

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 10:53
by yu
256色とは白黒濃淡ということでしょうか?
(知識が乏しくてすみません;)


今自分で考えたのですが

(12+13+255)/3 で平均をだせばうまくいくかな?
実際にやっていないのでおかしくなるかもしれません;

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 11:04
by abc
256色とは1バイトで表現できる色みたいなんですよ、
普通RGB値を使うとR1バイトG1バイトB1バイト予備1バイトの計4バイトで表現されてるみたいなんです。
色データを1バイトで表現できれば容量を1/4に出来るので、1バイトで表現したいのですが、うまくいかないです。
BMPINFOHEDAERのbiCount??見たいなやつで8ビットに変換できる見たいなんですが、うまくいきません。

平均でやるのは、やって見たんですがダメでした(やり方が悪いのかもしれないですが。。。)

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 11:10
by s-rush
256色というのはグレースケールのことでしょうか?
(↑yuさんのおっしゃる白黒濃淡のことです)

そうであるならば、
>>(12+13+255)/3 で平均をだせばうまくいくかな?
でもグレースケールになりますが、
以下の式を使われた方がいいかもしれません。

Y = ( 0.298912 * R + 0.586611 * G + 0.114478 * B )
Yは輝度に当たります。
詳しいことはよく分かりませんが、RGBそれぞれの係数は人間の目にとって
最も良い値になっているそうです。
確か緑の感度が最もいいからだったと思います。(逆だったかな?)

この式で求めた輝度値をRGBそれぞれの値に代入してあげれば、
グレースケールに変換することができます。

あとは画像の形式や、変換する方法によって少し変わってきますが^^;

ちなみに画像の変換はバイナリデータを読み取って行うのでしょうか?

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 11:14
by 御津凪
色のフォーマットとして1バイトでRGBを表示するのは、256の色情報をもつパレットを参照する、
いわゆるインデックスカラーというものです。
(GIF形式や 256色PNG形式もインデックスカラーです)
BMP形式でも同様に256色インデックスカラーがサポートされているので、
それについて調べてみると良いでしょう。

自力でフルカラーを256色に収める処理を書くのは(減色アルゴリズムを書くことになるので)大変ですが、
グレースケール変換なら yu さんや s-rush さんの方法を利用すれば比較的容易に行なえます。

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 11:23
by abc
グレースケールがいまいち分からないのですが、
多分白と黒で256段階の色を表現するんですよね??
私のやりたいのは、青や黄色赤も表示したいです。

StretchDIBitsでビットマップに書き込みたいのですが、色データをカラーテーブルの番号でやりたいです。
私の考えでは、カラーテーブルが256色用意されていて、1番目は青、2、薄い青、30番目赤とか用意されてないかなーって,,,,まったくの間違えの可能性が高いですが。

>>ちなみに画像の変換はバイナリデータを読み取って行うのでしょうか?
バイナリを扱うのでは、ありません。
なかなか説明が難しいのですが、RGB値の配列を受け取る感じで、それを描画したいだけなんですが、
RGB値を1バイトで表現したいのです、なんかわけの分からない質問でごめんなさい><

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 11:40
by abc
御津凪ありがとうございます。

私がしたいのは、減色アルゴリズムとほぼ同じようなことをしたいです。
減色アルゴリズムって言葉をはじめて知ったので、減色アルゴリズムについて調べて見ます。
ありがとうございました。

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 11:50
by yu
>Y = ( 0.298912 * R + 0.586611 * G + 0.114478 * B )

そ・・そんな式が・・orz
こちらが勉強になりました。
ありがとうございます。


>256色とは1バイトで表現できる色

そんなことができるんですね・・・初耳でした。
そして回答が的外れでした。すみませんorz


昔のゲームとかで、パレットがどうのこうのと聞いたことがありますが
それで、容量を節約しているんですね~。
(間違っていたら申し訳ないです;)

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 11:59
by 御津凪
> 昔のゲームとかで、パレットがどうのこうのと聞いたことがありますが
> それで、容量を節約しているんですね~。

それもありますが、
パレットで色を制御できるので、パレットの色を変えたり、差し替えるだけでその色を変えることが出来るので、
カラーアニメーションや色違いのキャラ(2Pカラーとか言うアレ)といったことが容易に可能になります。

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 12:18
by 朽木
(1111 1111)2 なので、 (AARR GGBB)2にすれば良いと思います。

変換サンプル書いてたんですが、ブラウザが突然落ちたのでパーに。(´;ω;`)ブワッ

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 13:09
by abc
朽木さん、(1111 1111)で(RRGG GBBB)って書いてあったんですが><
(AARR GGBB)ですか??

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 14:51
by s-rush
>>yuさん
輝度以外に色差というものもあります。
輝度: Y =                0.299*R + 0.587*G + 0.114*B
色差: Cb= 0.564*(B-Y) = -0.169*R - 0.331*G + 0.500*B
    Cr= 0.713*(R-Y) =  0.500*R - 0.419*G - 0.081*B
色差を求めておくとグレースケールからフルカラーに変換することができますよ。
上記の式をRGBについて解いてあげればいいですよね^^
(私はその変換プログラムを書いたことはないですが)

本トピではあまり関係ない話ですが、参考程度にどうぞ

Re:フルカラーから256色に変換

Posted: 2009年3月18日(水) 14:59
by abc
解決しました。;;
結局
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
} BITMAPINFO; というものがありまして、
bmiColors[/url]カラーテーブルにRGB値をセットすればよかったみたいです;;

わたしの質問の仕方に誤解があり大変もうしわけございませんでした。
解決とさせてもらいます。