按 "sky123" 的样图要求, 花边必须是透空的, 最好使用图元文件; 本例没有做完保存功能, 也没有实现整个图片的调整功能. 因为有测试图片, 给个源码下载吧:
http://files.cnblogs.com/del/sky123.rar
本例效果图:
代码文件:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Spin, ExtDlgs;
type
TForm1 = class(TForm)
Panel1: TPanel;
ScrollBox1: TScrollBox;
PaintBox1: TPaintBox;
Button1: TButton;
Button2: TButton;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
p1W: TSpinEdit;
bWidth: TSpinEdit;
bHeight: TSpinEdit;
ComboBox1: TComboBox;
Button3: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
p2W: TSpinEdit;
p3W: TSpinEdit;
p4W: TSpinEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure bWidthChange(Sender: TObject);
procedure bHeightChange(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure p1WChange(Sender: TObject);
procedure p2WChange(Sender: TObject);
procedure p3WChange(Sender: TObject);
procedure p4WChange(Sender: TObject);
procedure p1XChange(Sender: TObject);
procedure p1YChange(Sender: TObject);
procedure p2XChange(Sender: TObject);
procedure p2YChange(Sender: TObject);
procedure p3XChange(Sender: TObject);
procedure p3YChange(Sender: TObject);
procedure p4XChange(Sender: TObject);
procedure p4YChange(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses GDIPOBJ, GDIPAPI, TypInfo;
var
img,imgb: TGPImage;
b: TGPTextureBrush;
P1,P2,P3,P4: TGPPen;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
PaintBox1.Left := 0;
PaintBox1.Top := 0;
for i := 0 to 3 do
ComboBox1.Items.Add(GetEnumName(TypeInfo(TWrapMode), i));
ComboBox1.ItemIndex := 0;
img := TGPImage.Create;
imgb := TGPImage.Create;
b := TGPTextureBrush.Create;
P1 := TGPPen.Create;
P2 := TGPPen.Create;
P3 := TGPPen.Create;
P4 := TGPPen.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
img.Free;
imgb.Free;
b.Free;
P1.Free;
P2.Free;
P3.Free;
P4.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Filter :=
'All (*.jpg;*.png;*.gif;*.bmp;*.tif)|*.jpg;*.png;*.gif;*.bmp;*.tif|' +
'JPG (*.jpg)|*.jpg|' +
'PNG (*.png)|*.png|' +
'GIF (*.gif)|*.gif|' +
'BMP (*.bmp)|*.bmp|' +
'TIF (*.tif)|*.tif';
if OpenDialog1.Execute then
begin
img.Free;
img := TGPImage.Create(OpenDialog1.FileName);
PaintBox1.Repaint;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
OpenDialog1.Filter := GraphicFilter(TMetafile);
if OpenDialog1.Execute then
begin
imgb.Free;
imgb := TGPImage.Create(OpenDialog1.FileName);
bWidth.Text := IntToStr(imgb.GetWidth * 10);
bHeight.Text := IntToStr(imgb.GetHeight * 10);
p1w.Text := bHeight.Text;
p2w.Text := bHeight.Text;
p3w.Text := bWidth.Text;
p4w.Text := bWidth.Text;
PaintBox1.Repaint;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
SaveDialog1.Filter :=
'JPG (*.jpg)|*.jpg|' +
'PNG (*.png)|*.png|' +
'GIF (*.gif)|*.gif|' +
'BMP (*.bmp)|*.bmp|' +
'TIF (*.tif)|*.tif|' +
'All (*.jpg;*.png;*.gif;*.bmp;*.tif)|*.jpg;*.png;*.gif;*.bmp;*.tif';
if SaveDialog1.Execute then
begin
//暂时没做保存
end;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
g: TGPGraphics;
rt: TGPRect;
begin
if img.GetWidth = 0 then Exit;
if imgb.GetWidth > 0 then
begin
b.Free;
b := TGPTextureBrush.Create(imgb, TWrapMode(ComboBox1.ItemIndex),
MakeRect(0.0, 0, StrToIntDef(bWidth.Text, 0) / 10, StrToIntDef(bHeight.Text, 0) / 10));
P1.Free;
P2.Free;
P3.Free;
P4.Free;
P1 := TGPPen.Create(b, StrToIntDef(p1w.Text, 0) / 10);
P2 := TGPPen.Create(b, StrToIntDef(p2w.Text, 0) / 10);
P3 := TGPPen.Create(b, StrToIntDef(p3w.Text, 0) / 10);
P4 := TGPPen.Create(b, StrToIntDef(p4w.Text, 0) / 10);
P1.SetAlignment(PenAlignmentInset);
P2.SetAlignment(PenAlignmentInset);
P3.SetAlignment(PenAlignmentInset);
P4.SetAlignment(PenAlignmentInset);
end;
PaintBox1.ClientWidth := img.GetWidth;
PaintBox1.ClientHeight := img.GetHeight;
g := TGPGraphics.Create(PaintBox1.Canvas.Handle);
g.DrawImage(img, 0, 0, img.GetWidth, img.GetHeight);
rt := MakeRect(PaintBox1.ClientRect);
g.DrawLine(p1, rt.X, rt.Y, rt.X + rt.Width, rt.Y);
g.DrawLine(p2, rt.X, rt.Y + rt.Height, rt.X + rt.Width, rt.Y + rt.Height);
g.DrawLine(p3, rt.X, rt.Y, rt.X, rt.Y + rt.Height);
g.DrawLine(p4, rt.X + rt.Width, rt.Y, rt.X + rt.Width, rt.Y + rt.Height);
g.Free;
end;
procedure TForm1.bWidthChange(Sender: TObject);
var
n: Single;
begin
n := imgb.GetHeight / imgb.GetWidth;
bHeight.Text := IntToStr(Trunc(StrToIntDef(bWidth.Text, 1) * n));
PaintBox1.Repaint;
end;
procedure TForm1.bHeightChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p1WChange(Sender: TObject);
begin
PaintBox1.Repaint;
p2w.Text := p1w.Text;
end;
procedure TForm1.p1XChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p1YChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p2WChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p2XChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p2YChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p3WChange(Sender: TObject);
begin
PaintBox1.Repaint;
p4w.Text := p3w.Text;
end;
procedure TForm1.p3XChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p3YChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p4XChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p4YChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
procedure TForm1.p4WChange(Sender: TObject);
begin
PaintBox1.Repaint;
end;
end.
窗体文件:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 406
ClientWidth = 647
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
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 491
Top = 0
Width = 156
Height = 406
Align = alRight
BevelOuter = bvLowered
TabOrder = 0
object Button1: TButton
Left = 10
Top = 16
Width = 67
Height = 25
Caption = #25171#24320#22270#20687
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 83
Top = 16
Width = 67
Height = 25
Caption = #25171#24320#33457#36793
TabOrder = 1
OnClick = Button2Click
end
object GroupBox1: TGroupBox
Left = 6
Top = 55
Width = 147
Height = 122
Caption = #35843#25972#23567#22270
TabOrder = 2
object Label5: TLabel
Left = 17
Top = 21
Width = 40
Height = 13
Caption = #23567#22270#23485':'
end
object Label6: TLabel
Left = 80
Top = 21
Width = 40
Height = 13
Caption = #23567#22270#39640':'
end
object Label7: TLabel
Left = 17
Top = 73
Width = 52
Height = 13
Caption = #29615#32469#26679#24335':'
end
object bWidth: TSpinEdit
Left = 17
Top = 40
Width = 57
Height = 22
Increment = 5
MaxValue = 0
MinValue = 0
TabOrder = 0
Value = 0
OnChange = bWidthChange
end
object bHeight: TSpinEdit
Left = 80
Top = 40
Width = 57
Height = 22
Increment = 5
MaxValue = 0
MinValue = 0
TabOrder = 1
Value = 0
OnChange = bHeightChange
end
object ComboBox1: TComboBox
Left = 16
Top = 92
Width = 121
Height = 21
ItemHeight = 13
TabOrder = 2
Text = 'ComboBox1'
OnChange = ComboBox1Change
end
end
object GroupBox2: TGroupBox
Left = 6
Top = 188
Width = 147
Height = 138
Caption = #35843#25972#36793#23485
TabOrder = 3
object Label1: TLabel
Left = 17
Top = 27
Width = 40
Height = 13
Caption = #19978#36793#23485':'
end
object Label2: TLabel
Left = 17
Top = 55
Width = 40
Height = 13
Caption = #19979#36793#23485':'
end
object Label3: TLabel
Left = 17
Top = 82
Width = 40
Height = 13
Caption = #24038#36793#23485':'
end
object Label4: TLabel
Left = 17
Top = 111
Width = 40
Height = 13
Caption = #21491#36793#23485':'
end
object p1W: TSpinEdit
Left = 63
Top = 22
Width = 65
Height = 22
Increment = 5
MaxValue = 0
MinValue = 0
TabOrder = 0
Value = 0
OnChange = p1WChange
end
object p2W: TSpinEdit
Left = 63
Top = 50
Width = 65
Height = 22
Increment = 5
MaxValue = 0
MinValue = 0
TabOrder = 1
Value = 0
OnChange = p2WChange
end
object p3W: TSpinEdit
Left = 63
Top = 78
Width = 65
Height = 22
Increment = 5
MaxValue = 0
MinValue = 0
TabOrder = 2
Value = 0
OnChange = p3WChange
end
object p4W: TSpinEdit
Left = 63
Top = 106
Width = 65
Height = 22
Increment = 5
MaxValue = 0
MinValue = 0
TabOrder = 3
Value = 0
OnChange = p4WChange
end
end
object Button3: TButton
Left = 40
Top = 335
Width = 75
Height = 25
Caption = #20445#23384#22270#20687
TabOrder = 4
OnClick = Button3Click
end
end
object ScrollBox1: TScrollBox
Left = 0
Top = 0
Width = 491
Height = 406
Align = alClient
Color = clWhite
ParentColor = False
TabOrder = 1
object PaintBox1: TPaintBox
Left = 24
Top = 23
Width = 105
Height = 105
OnPaint = PaintBox1Paint
end
end
object OpenDialog1: TOpenDialog
Left = 232
Top = 216
end
object SaveDialog1: TSaveDialog
Left = 232
Top = 248
end
end