本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeCanvas;

type
  TForm1 = class(TForm)
    ButtonColor1: TButtonColor;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure ButtonColor1Click(Sender: TObject);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses GDIPOBJ, GDIPAPI;

var
  img: TGPImage;
  ImageAttributes: TGPImageAttributes;
  ColorMap: array[0..0] of TColorMap; {每个元素包含新旧两种颜色}

procedure TForm1.FormCreate(Sender: TObject);
begin
  img := TGPImage.Create('c:\temp\test.png');
  ClientWidth := img.GetWidth;
  ClientHeight := img.GetHeight;

  ImageAttributes := TGPImageAttributes.Create;
  ColorMap[0].oldColor := aclBlack;
  ColorMap[0].newColor := aclBlack;

  ButtonColor1.Caption := '替换';
  Button1.Caption := '复原';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  img.Free;
  ImageAttributes.Free;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  color: TColor;
begin
  color := GetPixel(Canvas.Handle, X, Y);
  ColorMap[0].oldColor := ColorRefToARGB(color);
  ButtonColor1.SymbolColor := color;
  ButtonColor1.Refresh;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
begin
  g := TGPGraphics.Create(Canvas.Handle);

  g.DrawImage(img,
              MakeRect(0, 0, img.GetWidth, img.GetHeight),
              0, 0,
              img.GetWidth, img.GetHeight,                 
              UnitPixel,
              ImageAttributes
              );

  g.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ButtonColor1.SymbolColor := ARGBToColorRef(ColorMap[0].OldColor);
  ButtonColor1.Enabled := True;
  ButtonColor1.Update;

  ImageAttributes.ClearRemapTable; {ClearRemapTable}
  Repaint;
end;

procedure TForm1.ButtonColor1Click(Sender: TObject);
begin
  ColorMap[0].newColor := ColorRefToARGB(ButtonColor1.SymbolColor);
  ImageAttributes.SetRemapTable(Length(ColorMap), @ColorMap); {SetRemapTable}
  Repaint;
  ButtonColor1.Enabled := False;
end;

end.

窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 220
  ClientWidth = 315
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnMouseUp = FormMouseUp
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object ButtonColor1: TButtonColor
    Left = 231
    Top = 8
    Caption = 'ButtonColor1'
    TabOrder = 0
    OnClick = ButtonColor1Click
  end
  object Button1: TButton
    Left = 231
    Top = 39
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
end

posted on 2008-07-08 15:40  万一  阅读(4016)  评论(8编辑  收藏  举报