本論文では、GDI +は、DelphiのプログラムコードでGDI +アプリケーションについての私の他の記事を参照して、Photoshopの色相/彩度/明度の機能を実現するためにも使用TBitmapのために利用可能です。
一部の人は好きではない、またはBASM Delphiコードを理解していないので、この論文の純粋なPASコード。より低い純粋PASコード効率は、実用には適していないことに留意すべきです。C / C ++と同じように、あなたは私の記事「を参照してくださいすることができますC ++は、Photoshopの色相/彩度/明度の機能を実現するさまざまな言語に加えて、他は同じで、」。
Photoshopの彩度調整原理について「で見つけることができますDelphiのプログラムでGDI +アプリケーション-画像彩度調整、」、明るさの調整原理を参照してください「DelphiのプログラムでGDI +アプリケーションを-明るさ調整のPhotoshopの模倣を。」
以下は、完全なDelphiのプログラム、Photoshopの色相/彩度/明度関数純粋PASコードがその中に具現化されます。
メインユニットと
インタフェース
用途
Windowsの、メッセージ、sysutilsの、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、ExtCtrls、StdCtrls、ComCtrls、GDIPlusの。
タイプ
TForm1 =クラス(TFormは)
Label1:TLabel;
Label2を:TLabel;
LABEL3:TLabel;
HBAR:TTrackBar。
SBAR:TTrackBar。
BBAR:TTrackBar。
HEdit:TEDIT。
私は疲れが座っていました。
BEdit:TEDIT。
ボタン1:TButtonの。
PaintBox1:TPaintBox。
手順FormCreate(送信者:TObjectを);
手順FormDestroy(送信者:TObjectを);
手順PaintBox1Paint(送信者:TObjectを);
手順HBarChange(送信者:TObjectを);
手順SBarChange(送信者:TObjectを);
手順BBarChange(送信者:TObjectを);
手順HEditChange(送信者:TObjectを);
手続きButton1Click(送信者:TObjectを);
プライベート
{プライベート宣言}
出典:TGpBitmap。
ビットマップ:TGpBitmap。
R:TGpRect。
ロック:ブール値。
パブリック
{公開宣言}
終わり;
ました
Form1の:TForm1;
実装
{$ Rの*の.DFM}
手順SwapRGB(VARのA、Bは整数)。
ベギン
INC(A、B)。
B: - ; B =
12月(B)
終わり;
手順CheckRGB(VAR値:整数);
ベギン
= 0:値<0 [値の場合
それ以外の値> 255 [値の場合:= 255;
終わり;
手順AssignRGB(VARのR、G、B:バイト、INTR、INTG、INTB:整数)。
ベギン
Rは、固定されました=。
G:= INTG。
B:= INTB。
終わり;
プロシージャSetBright(VARのR、G、B:バイト; bValue:整数)。
ました
INTG、INTB整数を入力します。
ベギン
で:= R。
INTG:= G。
INTB:= B。
その後、bValue場合> 0
ベギン
株式会社(中(255 - で)* bValue DIV 255)。
株式会社(INTG、(255 - INTG)* bValue DIV 255)。
株式会社(INTB、(255 - INTB)* bValue DIV 255)。
終わり
bValue <0であれば、他のその後
ベギン
(* bValue divの255の間で)株式会社。
株式会社(INTG、INTG * bValue divの255)。
株式会社(INTB、INTB * bValue divの255)。
終わり;
CheckRGB(IN)。
CheckRGB(INTG)。
CheckRGB(INTB)。
AssignRGB(R、G、B、INTR、INTG、INTB)。
終わり;
SetHueAndSaturation手順(R、G、B:バイト; hValue、sValue:整数)。
ました
INTG、INTB整数を入力します。
H、S、L、ラム:整数。
デルタ、全体:整数;
インデックス、余分:整数;
ベギン
で:= R。
INTG:= G。
INTB:= B。
もしINTR <INTG次いでSwapRGB(INTR、INTG)。
もしINTR <INTB次いでSwapRGB(INTR、INTB)。
もしINTB> INTG次いでSwapRGB(INTB、INTG)。
=デルタ - INTB。
デルタ= 0その後、終了した場合。
+ INTB全体=;
L:=全SHR 1。
その後、L <128の場合
S:=デルタ* 255のdiv全体
他
Sは:デルタ* 255件のdiv(510 - 全体を)=。
もしhValue <> 0その後、
ベギン
INTR = Rであれば、その後
H:=(G - B)* 60 DIVデルタ
INTR = Gであれば、他のその後
H:=(B - R)* 60 DIVデルタ+ 120
他
H:=(R - G)* 60 DIVデルタ+ 240。
INC(H、hValue)。
H <0の場合であれば
INC(H、360)
他に、その後H> 360であれば
12月(H、360)。
インデックス:= H divの60;
エクストラ:= H MOD 60;
次に、もし(インデックス1)<> 0
エクストラ:= 60 - 余分な。
エクストラ:=(余分* 255 + 30)60をDIV。
INTG:=余分な - (エクストラ - 128)*(255 - S)DIV 255;
ラム:= L - 128。
その後、ラムの場合> 0
株式会社(INTG、(((255 - INTG)*ラム+ 64)のdiv 128))
ラム<0であれば、他のその後
株式会社(INTG、(INTG *ラムのDIV 128));
CheckRGB(INTG)。
の場合インデックス
1:SwapRGB(IN、INTG)。
2:
ベギン
SwapRGB(IN、INTB)。
SwapRGB(INTG、INTB)。
終わり;
3:SwapRGB(IN、INTB)。
4:
ベギン
SwapRGB(IN、INTG)。
SwapRGB(INTG、INTB)。
終わり;
5:SwapRGB(INTG、INTB)。
終わり;
終わり
他
ベギン
で:= R。
INTG:= G。
INTB:= B。
終わり;
もしsValue <> 0その後、
ベギン
その後、sValue場合> 0
ベギン
もしsValue + S> = 255、その後sValue:= S
他sValue:= 255 - sValue。
sValue = 65025のdiv sValue - 255。
終わり;
株式会社(中((間 - L)sValue divの255));
株式会社(INTG、((INTG - L)* sValue divの255));
株式会社(INTB、((INTB - L)* sValue divの255));
CheckRGB(IN)。
CheckRGB(INTG)。
CheckRGB(INTB)。
終わり;
AssignRGB(R、G、B、INTR、INTG、INTB)。
終わり;
手順GdipHSBAdjustment(BMP:TGpBitmap; hValue、sValue、bValue:整数)。
ました
データ:TBitmapData。
X、Y:整数。
P:PRGBQuad。
ベギン
sValue = sValue * 255 DIV 100;
bValue:DIV 100 = bValue * 255。
データ:= Bmp.LockBits(GpRect(0、0、Bmp.Width、Bmp.Height)、[IMREAD、IMWRITE]、pf32bppARGB)。
試します
P:= Data.Scan0。
yについて:= 1 Data.Height行うには
ベギン
xについて:= 1 Data.Width行うには
ベギン
場合(sValue> 0)および(bValue <> 0)
SetBright(P ^ .rgbRed、P ^ .rgbGreen、P ^ .rgbBlue、bValue)。
SetHueAndSaturation(P ^ .rgbRed、P ^ .rgbGreen、P ^ .rgbBlue、hValue、sValue)。
IF(sValue <= 0)および(bValue <> 0)を
SetBright(P ^ .rgbRed、P ^ .rgbGreen、P ^ .rgbBlue、bValue)。
株式会社(P);
終わり;
終わり;
最後に
Bmp.UnlockBits(データ);
終わり;
終わり;
手順TForm1.FormCreate(送信者:TObjectを);
ベギン
出典:= TGpBitmap.Create( '../../ GdiplusDemo /メディア/ 100_0349.jpg');
R:= GpRect(0、0、Source.Width、Source.Height)。
ビットマップ:= Source.Clone(R、pf32bppARGB)。
DoubleBuffered:=真;
終わり;
手続きTForm1.FormDestroy(送信者:TObjectを);
ベギン
Bitmap.Free;
Source.Free;
終わり;
手順TForm1.PaintBox1Paint(送信者:TObjectを);
ました
G:TGpGraphics。
ベギン
G:= TGpGraphics.Create(PaintBox1.Canvas.Handle)。
試します
g.DrawImage(ビットマップ、R)
g.TranslateTransform(0、r.Height)。
g.DrawImage(ソース、R)
最後に
g.Free;
終わり;
終わり;
手順TForm1.HBarChange(送信者:TObjectを);
ベギン
その後、ロックしない場合
HEdit.Text:= IntToStr(HBar.Position)。
終わり;
手順TForm1.SBarChange(送信者:TObjectを);
ベギン
その後、ロックしない場合
SEdit.Text:= IntToStr(SBar.Position)。
終わり;
手順TForm1.BBarChange(送信者:TObjectを);
ベギン
その後、ロックしない場合
BEdit.Text:= IntToStr(BBar.Position)。
終わり;
手順TForm1.HEditChange(送信者:TObjectを);
ベギン
ロック:=真;
もしTEDIT(送信者)の.text = '' その後、
TEDIT(送信者)の.text:= '0';
ケースTEDIT(送信者)の.TAG
0:HEdit.Text:= IntToStr(HBar.Position)。
1:HEdit.Text:= IntToStr(HBar.Position)。
2:HEdit.Text:= IntToStr(HBar.Position)。
終わり;
ロック:= falseは、
Bitmap.Free;
ビットマップ:= Source.Clone(R、pf32bppARGB)。
IF(HBar.Position <> 0)又は(SBar.Position <> 0)又は(BBar.Position <> 0)を
GdipHSBAdjustment(ビットマップ、HBar.Position、SBar.Position、BBar.Position)。
PaintBox1.Invalidate;
終わり;
手順TForm1.Button1Click(送信者:TObjectを);
ベギン
HBar.Position:= 0;
SBar.Position:= 0;
BBar.Position:= 0;
終わり;
終わり。
プログラムのインターフェイスのスクリーンショット:
「コードのGdiPlusユニットとBUGは、正しい参照記事をダウンロード- GDI +とVCL GDI + VCLの基礎について。」
アドバイスと指導に書いてください:[email protected]
注意:以前のBASMを終えた2009年11月1日のこの記事では、「Delphiの画像処理」シリーズに転送することが、この記事からコードを削除し、ここにお詫び申し上げます。