平时的画图操作一般都调用canvas.moveto;lineto。是在哪儿将对canvas的操作保存到fimage中的呢?
看了一段时间tgraphic,找不到门路,快崩溃了

解决方案 »

  1.   


    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;
      

  2.   


    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;
      

  3.   

      with inherited Canvas do
        StretchDraw(DestRect, Picture.Graphic);//这里
    这句是吧Picture.Graphic的内容显示到canvas上吧,防止刷新后图像被擦掉
    我想知道在使用image.canvas.lineto后,对图形的操作是怎样保存到Picture.Graphic中的
      

  4.   


    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;
      

  5.   

    to mygodsos:
    savetofile最后调用了tbitmap的writestream,将fimage的fsavestream保存到stream中
    能不能解释一下Canvas.Rectangle(0, 0, bit.Width,bit.Height)之后,tbitmap对fimage的对象进行了什么操作
    TCanvas的Rectangle只是关于canvas本身的操作,没有涉及到具体的图形对象呀
      

  6.   

    Canvas.Rectangle(0, 0, bit.Width,bit.Height)
    用刷子刷一个矩形,从0,0到bitmap大小的实心矩形
      

  7.   

    上面的回复只是说明了Delphi中的一些表面现象,而没有说到实质性的问题。如果你用Widnows SDK写过内存中的绘制图像的程序,你就会明白了。一个DC必须有一张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但是,我想应当是这样的。