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
No.3ベストアンサー
- 回答日時:
★アドバイス
>この式で、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 …
No.4
- 回答日時:
>この式で、255から引くことによってどうして反転するのか具体的に知りたいです。
色の反転は各色の最大値を最小値へ、最小値を最大値へ変換します。
「新しい明るさ=最大値+(現在の明るさ-最小値)」ですが、移項して「新しい明るさ=(最大値+最小値)-現在の明るさ」として、(最大値+最小値)を255と書けば文字数が少なくなるので、書いてあるのでしょう。
No.2
- 回答日時:
それぞれの色は8ビットで表されるので最も明るい色が255になり最も暗い色が0になります。
255から引くことで明るさが入れ替わりますね
255->0
254->1
・
・
1->254
0->255
No.1
- 回答日時:
まずGBRの場合、0に緑、1に青、2に赤が格納されていると思います。
(プログラムの都合によって順番が変わっているかもしれません)
次に本題ですが反転とはビットが逆転すること。
例えば11110000なら00001111となります。
C言語で記述しているのなら自身のNotを取った方がスマートですね。
8bitの反転は255から自身を引いても同じ結果になります。
実際に自分で計算して確かめてみて下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- HTML・CSS htmltとcssのコードで 1 2022/11/26 13:37
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- 工学 電磁気学についての質問になります。 画像のような2つのループ電流相互に働く回転力を求める問題です。 1 2022/11/21 15:40
- 物理学 電磁気学についての質問になります。 画像のような2つのループ電流相互に働く回転力を求める問題です。 1 2023/02/08 21:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
verilog 符号付加減算(最上位...
-
命令について
-
C言語やC++言語でビット毎に値...
-
16進数でのAND演算
-
シーケンサで時間計算
-
一般のソフトで画像を扱う場合...
-
1の補数
-
PS3に搭載されている"Cell"は、...
-
16ビットCPUで32ビットの計算方法
-
BMP画像のネガを作成するプログ...
-
算術シフト演算が成り立つ理由...
-
C++の言語で{}の中身が int x=2...
-
三菱 シーケンサー
-
C言語「K&R」の演習2-9について
-
8086で加算減算とキャリーフラグ
-
ビットシフトってどんな時使うの?
-
COBOL計算式の中間ワークについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
C言語で128bitの2進数のビット...
-
命令について
-
符号無し整数xを右にnビット回転
-
文字参照は10進数と16進数では...
-
verilog 符号付加減算(最上位...
-
[VBS] 素早くローテート演算したい
-
算術シフト演算が成り立つ理由...
-
アルゴリズムの計算量とオーダ
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
CASLIIでかけ算
-
上位ビットと下位ビットの入れかえ
-
ブール代数で解き方がわかりません
-
ビットの取り出し方法
-
16ビットCPUで32ビットの計算方法
おすすめ情報