プロが教える店舗&オフィスのセキュリティ対策術

BMP画像をnegative colorにするプログラムの手本を見ていて、どういう仕組でネガが作成されるのか疑問に思いました。
以下のプログラムがそれです。

--------------------------------------------------

for(i=0; i<NVERT; i++){ //縦方向のループ
for(j=0; j<NHORI; j++){ //横方向のループ
ich1=i*NHORI+j; //処理する点(?)をich1に格納
for(k=0; k<3; k++){ //GBRを順番に反転させるためのループ(?)
buf[ich1][k]=255-buf[ich1][k]; //反転
}
}
}

--------------------------------------------------

まだあまり理解できていないのですが、
buf[][0]には赤、buf[][1]には緑、buf[][2]には青
が与えられている気がします。

buf[ich1][k]=255-buf[ich1][k];

この式で、255から引くことによってどうして反転するのか具体的に知りたいです。
どなたかよろしくお願いしますm(__)m

A 回答 (4件)

★アドバイス


>この式で、255から引くことによってどうして反転するのか具体的に知りたいです。
 単純に1色 8 ビットで表現しているため、255 から引くのです。
 ポジティブ・ネガティブ変換はビットの反転を行えばよいのです。→補数を取る
 このビットの反転は color & 0xFF でも良いのですが、255 から引いて補数を
 取る方法でも同じになるのです。
・よって、255 とは1色 8 ビットの補数を取るための 255 です。
 もし、1色 4 ビットなら補数として 15 の数になります。
>buf[ich1][k]=255-buf[ich1][k];
 ↑の部分は
 buf[ich1][k] ^= 0xFF;
 でも同じになります。こちらの方がちょっと高速演算されます。
・以上。おわり。

参考URL:http://homepage3.nifty.com/rio_i/lab/xlib/021fil …
    • good
    • 0

>この式で、255から引くことによってどうして反転するのか具体的に知りたいです。


色の反転は各色の最大値を最小値へ、最小値を最大値へ変換します。
「新しい明るさ=最大値+(現在の明るさ-最小値)」ですが、移項して「新しい明るさ=(最大値+最小値)-現在の明るさ」として、(最大値+最小値)を255と書けば文字数が少なくなるので、書いてあるのでしょう。
    • good
    • 0

それぞれの色は8ビットで表されるので最も明るい色が255になり最も暗い色が0になります。


255から引くことで明るさが入れ替わりますね
255->0
254->1


1->254
0->255
    • good
    • 0

まずGBRの場合、0に緑、1に青、2に赤が格納されていると思います。


(プログラムの都合によって順番が変わっているかもしれません)

次に本題ですが反転とはビットが逆転すること。
例えば11110000なら00001111となります。
C言語で記述しているのなら自身のNotを取った方がスマートですね。

8bitの反転は255から自身を引いても同じ結果になります。
実際に自分で計算して確かめてみて下さい。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!