明るさ,コントラスト補正を写真画像に適用させる(VCL) ~Delphiソースコード集
(参考)バイキュービック法(bicubic)で拡大縮小する(VCL)
(参考)バイキュービック法(bicubic)で拡大縮小する(FMX)
(参考)バイラテラルフィルタ(bilateral filter)で美肌に加工(VCL)
(参考)バイラテラルフィルタ(bilateral filter)で美肌に加工(FMX)
(参考)ガンマ(gamma)補正を画像に適用する(VCL)
(参考)ガンマ(gamma)補正を画像に適用する(FMX)
(参考)ソーベルフィルタ(Sobel filter)で境界(エッジ)検出(VCL)
明るさ、コントラスト補正を使用する為のファイルの準備
本ページの下部のソースコードをコピーして「UMamBrightContrast.pas」ファイルを作成し、 プロジェクトフォルダ内に入れる。プロジェクトの作成とソースコードの記述
プロジェクトを新規作成(VCLアプリケーション)し、フォーム(Form1)にTImageを2個、TTrackBarを2個、TButtonを1個配置する。Image1のPictureプロパティから、明るさ、コントラスト補正を適用したい画像をロードしておく。
unit Unit1;
interface
uses
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls,
Vcl.Imaging.jpeg, Vcl.Imaging.pngimage;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses UMamBrightContrast;
procedure TForm1.Button1Click(Sender: TObject);
var sbmp,dbmp:TBitmap;
begin
sbmp:=TBitmap.Create;
dbmp:=TBitmap.Create;
try
sbmp.Assign(Image1.Picture.Graphic);
//MamBright(変換元TBitmap,変換後TBitmap,強さ[暗く-1.0~+1.0明るく])
MamBright(sbmp,dbmp,TrackBar1.Position/100);
//MamContrast(変換元TBitmap,変換後TBitmap,強さ[下げる-1.0~+1.0上げる])
MamContrast(dbmp,Image2.Picture.Bitmap,TrackBar2.Position/100);
finally
sbmp.Free;
dbmp.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Proportional:=True;
Image2.Proportional:=True;
//明るさ調整
TrackBar1.Min:=-100;
TrackBar1.Max:=100;
TrackBar1.Position:=0;
TrackBar1.Frequency:=10;
TrackBar1.SelEnd:=1;
TrackBar1.PositionToolTip:=ptBottom;
//コントラスト調整
TrackBar2.Min:=-100;
TrackBar2.Max:=100;
TrackBar2.Position:=0;
TrackBar2.Frequency:=10;
TrackBar2.SelEnd:=1;
TrackBar2.PositionToolTip:=ptBottom;
end;
end.
実行する
実行ボタンを押して実行します。(デバッグ実行でもOK)Button1をクリックすると、Image1画像に明るさ、コントラスト補正が適用された画像をImage2に表示します。
「UMamBrightContrast.pas」ファイルのソースコード
unit UMamBrightContrast;
interface //■■■宣言部■■■
uses System.Types,System.UITypes, System.Math,
System.Generics.Collections, System.Generics.Defaults,
VCL.Graphics;
//使い方 MamContrast(変換元TBitmap,変換後TBitmap,強さ[-1.0~+1.0])
procedure MamContrast(src,dest:VCL.Graphics.TBitmap;Strength:Single=0.0);
//使い方 MamContrast(変換元TBitmap,変換後TBitmap,強さ[-1.0~+1.0])
procedure MamBright(src,dest:VCL.Graphics.TBitmap;Strength:Single=0.0);
implementation //■■■実装部■■■
Type
TRGB=record B,G,R:Byte; end;
TRGBArr=array[0..65535] of TRGB;
PRGBArr=^TRGBArr;
TRGBArrArr=array[0..65535] of PRGBArr;
procedure MamContrast(src,dest:VCL.Graphics.TBitmap;Strength:Single=0.0);
var v:byte;
x,y:Integer;
r,g,b:Integer;
SrcBmp,DestBmp:TBitmap;//src,destの一時画像
fRect:TRect;
SrcRGB,DestRGB:PRGBArr;
begin
if not assigned(src) then exit;
if not assigned(dest) then dest:=VCL.Graphics.TBitmap.Create;
fRect.Left:=0;
fRect.Top:=0;
fRect.Width:=src.Width;
fRect.Height:=src.Height;
if Strength> 1 then Strength:= 1;
if Strength<-1 then Strength:=-1;
Strength:=Strength+1;
SrcBmp:=VCL.Graphics.TBitmap.Create;
DestBmp:=VCL.Graphics.TBitmap.Create;
try
SrcBmp.PixelFormat:=pf24bit;
SrcBmp.Width :=fRect.Width;
SrcBmp.Height:=fRect.Height;
SrcBmp.Canvas.Draw(0,0,src);
DestBmp.PixelFormat:=pf24bit;
DestBmp.Width:=fRect.Width;
DestBmp.Height:=fRect.Height;
dest.Width:=fRect.Width;
dest.Height:=fRect.Height;
v:=127;
for y := 0 to SrcBmp.Height-1 do
begin
SrcRGB:=SrcBmp.Scanline[y];
DestRGB:=DestBmp.Scanline[y];
for x := 0 to fRect.Width-1 do
begin
r:=Round((SrcRGB[x].R-v)*Strength+v);
g:=Round((SrcRGB[x].G-v)*Strength+v);
b:=Round((SrcRGB[x].B-v)*Strength+v);
if r>255 then r:=255;
if g>255 then g:=255;
if b>255 then b:=255;
if r<0 then r:=0;
if g<0 then g:=0;
if b<0 then b:=0;
DestRGB[x].R:=r;
DestRGB[x].G:=g;
DestRGB[x].B:=b;
end;
end;
dest.Canvas.Draw(0,0,DestBmp);
finally
SrcBmp.Free;
DestBmp.Free;
end;
end;
procedure MamBright(src,dest:VCL.Graphics.TBitmap;Strength:Single=0.0);
var x,y:Integer;
r,g,b:Integer;
SrcBmp,DestBmp:TBitmap;//src,destの一時画像
fRect:TRect;
SrcRGB,DestRGB:PRGBArr;
begin
if not assigned(src) then exit;
if not assigned(dest) then dest:=VCL.Graphics.TBitmap.Create;
fRect.Left:=0;
fRect.Top:=0;
fRect.Width:=src.Width;
fRect.Height:=src.Height;
if Strength> 1 then Strength:= 1;
if Strength<-1 then Strength:=-1;
Strength:=Strength*127;
SrcBmp:=VCL.Graphics.TBitmap.Create;
DestBmp:=VCL.Graphics.TBitmap.Create;
try
SrcBmp.PixelFormat:=pf24bit;
SrcBmp.Width :=fRect.Width;
SrcBmp.Height:=fRect.Height;
SrcBmp.Canvas.Draw(0,0,src);
DestBmp.PixelFormat:=pf24bit;
DestBmp.Width:=fRect.Width;
DestBmp.Height:=fRect.Height;
dest.Width:=fRect.Width;
dest.Height:=fRect.Height;
for y := 0 to SrcBmp.Height-1 do
begin
SrcRGB:=SrcBmp.Scanline[y];
DestRGB:=DestBmp.Scanline[y];
for x := 0 to fRect.Width-1 do
begin
r:=Round(SrcRGB[x].R+Strength);
g:=Round(SrcRGB[x].G+Strength);
b:=Round(SrcRGB[x].B+Strength);
if r>255 then r:=255;
if g>255 then g:=255;
if b>255 then b:=255;
if r<0 then r:=0;
if g<0 then g:=0;
if b<0 then b:=0;
DestRGB[x].R:=r;
DestRGB[x].G:=g;
DestRGB[x].B:=b;
end;
end;
dest.Canvas.Draw(0,0,DestBmp);
finally
SrcBmp.Free;
DestBmp.Free;
end;
end;
end.
