本例效果图:
代码文件: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.