procedure TForm1.FormCreate(Sender: TObject); procedure TImage.Paint; var Save: Boolean; begin if csDesigning in ComponentState then with inherited Canvas do begin Pen.Style := psDash; Brush.Style := bsClear; Rectangle(0, 0, Width, Height); end; Save := FDrawing; FDrawing := True; try with inherited Canvas do StretchDraw(DestRect, Picture.Graphic);//这里 finally FDrawing := Save; end; end;
procedure TForm1.Button4Click(Sender: TObject); var bit:TBitmap; jp:TJpegImage; //uses jpeg begin bit:=TBitmap.Create; jp:=TJPEGImage.Create; jp.LoadFromFile('d:\雪蛤.jpg'); bit.Assign(jp); Canvas.Brush.Bitmap:=bit; Canvas.Rectangle(0, 0, bit.Width,bit.Height); bit.Free; jp.Free; end;
with inherited Canvas do StretchDraw(DestRect, Picture.Graphic);//这里 这句是吧Picture.Graphic的内容显示到canvas上吧,防止刷新后图像被擦掉 我想知道在使用image.canvas.lineto后,对图形的操作是怎样保存到Picture.Graphic中的
procedure TForm1.FormCreate(Sender: TObject);
procedure TImage.Paint;
var
Save: Boolean;
begin
if csDesigning in ComponentState then
with inherited Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, Width, Height);
end;
Save := FDrawing;
FDrawing := True;
try
with inherited Canvas do
StretchDraw(DestRect, Picture.Graphic);//这里
finally
FDrawing := Save;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
bit:TBitmap;
jp:TJpegImage; //uses jpeg
begin
bit:=TBitmap.Create;
jp:=TJPEGImage.Create;
jp.LoadFromFile('d:\雪蛤.jpg');
bit.Assign(jp);
Canvas.Brush.Bitmap:=bit;
Canvas.Rectangle(0, 0, bit.Width,bit.Height);
bit.Free;
jp.Free;
end;
StretchDraw(DestRect, Picture.Graphic);//这里
这句是吧Picture.Graphic的内容显示到canvas上吧,防止刷新后图像被擦掉
我想知道在使用image.canvas.lineto后,对图形的操作是怎样保存到Picture.Graphic中的
var
bit:TBitmap;
jp:TJpegImage; //uses jpeg
begin
bit:=TBitmap.Create;
jp:=TJPEGImage.Create;
jp.LoadFromFile('d:\雪蛤.jpg');
bit.Assign(jp);
// Canvas.Brush.Bitmap:=bit;
// Canvas.Rectangle(0, 0, bit.Width,bit.Height);
bit.Canvas.Pen.Color:=clRed;
bit.Canvas.LineTo(200,200); Canvas.Brush.Bitmap:=bit;
Canvas.Rectangle(0, 0, bit.Width,bit.Height);
bit.SaveToFile('d:\雪蛤1.bmp');
bit.Free;
jp.Free;
end;
savetofile最后调用了tbitmap的writestream,将fimage的fsavestream保存到stream中
能不能解释一下Canvas.Rectangle(0, 0, bit.Width,bit.Height)之后,tbitmap对fimage的对象进行了什么操作
TCanvas的Rectangle只是关于canvas本身的操作,没有涉及到具体的图形对象呀
用刷子刷一个矩形,从0,0到bitmap大小的实心矩形
var
hMemDC : HDC;
hMemBmp: HBITMAP;
hOldBmp: HBITMAP;
begin
// 创建一个跟屏幕相兼容的DC对象
hMemDC := CreateCompatibleDC(0);
// 创建一个跟该DC相兼容的Bitmap
hMemBmp:= CreateCompatibleBitmap(hMemDC, Self.Width, Self.Height); // 将bitmap跟DC关联起来
hOldBmp:= SelectObject(hMemDC, hMemBmp); // 绘图操作,这时的绘图操作表面上是在DC上进行的,而实际上,是对Bitmap进行操作,DC只是一个虚拟的设备而已,保存了一些绘图中的基本信息,比如画笔,画刷,等信息,实际是在Bitmap的DIB中写入内容
Rectangle(hMemDC, 0, 0, Self.Width, Self.Height); // 完成操作后,可以传送到显示DC进行显示
BitBlt(Self.Canvas.Handle, 0, 0, Self.Width, Self.Height,
hMemDC, 0, 0, SRCCOPY); // 恢复DC上的旧内容
SelectObject(hMemDc, hOldBmp); // 删除Bitmap
DeleteObject(hMemBmp); // 删除DC
DeleteDC(hMemDC);
end; Delphi也是运行在Windows中,所以,它势必也是按照这样的过程来的。只是它将DC封装成了TCanvas,HBITMAP封装成了TBitmap. 虽然我没有深入了解TBitmap但是,我想应当是这样的。