GDI +アプリケーションPhotoshopの色相彩度明度機能デルファイプログラム

本論文では、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の画像処理」シリーズに転送することが、この記事からコードを削除し、ここにお詫び申し上げます。

おすすめ

転載: www.cnblogs.com/blogpro/p/11426649.html