コラム/もーのーくーろー
前回の処理に、
モノクロにする処理を追加します。
モノクロにするには、
明るさを計算しないといけません。
明るさを代入する変数を定義します。
var
PBit:PByteArray;
x,y:Integer;
R,G,B:Byte;
Bmp:TBitmap;
Light:Byte;
Lightって変数にしてみました。
明るさを求める式は、
明るさ=R×0.30+G×0.59+B×0.11
だそうです。
早速記述します。
PBit:=Bmp.ScanLine[y];
B:=PBit[x*3 ];
G:=PBit[x*3+1];
R:=PBit[x*3+2];
の末尾に、
PBit:=Bmp.ScanLine[y];
B:=PBit[x*3 ];
G:=PBit[x*3+1];
R:=PBit[x*3+2];
Light:=Round(R*0.3+G*0.59+B*0.11);
と、追加します。
R*0.3+G*0.59+B*0.11はそのまんまですね。
それを、Round関数でくくってます。
Round関数は、小数点以下を四捨五入して丸める関数です。
Byte型は整数ですから、小数を入れたらエラーになるので。
明るさが出たところで、
その明るさを、
R,G,Bの値にすると、モノクロになります。
RGBの抜き取る処理を、逆にやればいいですね。
PBit:=Bmp.ScanLine[y];
B:=PBit[x*3 ];
G:=PBit[x*3+1];
R:=PBit[x*3+2];
Light:=Round(R*0.3+G*0.59+B*0.11);
PBit[x*3 ]:=Light;
PBit[x*3+1]:=Light;
PBit[x*3+2]:=Light;
こんな感じです。
さて、これで終わりだと思ったのですが、
実行しても、
すぐに反映されず、
いったん他のウィンドウで隠して、戻したりしたときだけ、
そこが白黒になってました。
Graphicが書き換わっても、
それが反映されないみたいです。
コードの最後に、これを入れたらできました。
Image1.Refresh;
多分、再描画する手続きです。
Ctrl+Spaceでリストだして、適当に探したので違うかも???wwwwwwwww
まとめると
procedure TForm1.Button3Click(Sender: TObject);
var
PBit:PByteArray;
x,y:Integer;
R,G,B:Byte;
Bmp:TBitmap;
Light:Byte;
begin
Bmp:=TBitmap.Create;
Bmp.Assign(Image1.Picture.Graphic);
Bmp.PixelFormat:=pf24bit;
For y:=0 to Bmp.Height-1 do begin
For x:=0 to Bmp.Width-1 do begin
PBit:=Bmp.ScanLine[y];
B:=PBit[x*3 ];
G:=PBit[x*3+1];
R:=PBit[x*3+2];
Light:=Round(R*0.3+G*0.59+B*0.11);
PBit[x*3 ]:=Light;
PBit[x*3+1]:=Light;
PBit[x*3+2]:=Light;
end;
end;
Image1.Picture.Graphic.Assign(Bmp);
Bmp.Free;
Image1.Refresh;
end;
てな感じです。
モノクロを押したら
できたっ!><
コンテンツ
最新の12件
2023-06-12
2021-02-15
2013-06-19
2012-07-14
2012-02-04
2012-01-06
2011-03-31
2010-08-26
2010-03-15
2009-10-21
2009-02-12
2008-11-18
メニュー編集
- counter: 738
- today: 1
- yesterday: 0
- online: 2