问题一:
procedure TBmp_F.btn1Click(Sender: TObject);
var
  MyRect : TRect;
  Bitmap: TBitmap;
begin
  MyRect := Rect(0,0,100,100);
  Bitmap := TBitmap.Create;
  Bitmap.Canvas.CopyRect(MyRect,img1.Canvas,MyRect);
  img2.Picture.Bitmap := Bitmap;
end;这样子将img1的MyRect区域显示到img2吗?  显示不了啊
要怎么做?问题二:
procedure TBmp_F.btn1Click(Sender: TObject);
var
  MyRect : TRect;
  Bitmap: TBitmap;
begin
  MyRect := Rect(0,0,100,100);
  Bitmap := TBitmap.Create;
  img2.Canvas.CopyRect(MyRect,img1.Canvas,MyRect);
end;这段代码将img1的相关区域COPY到了img2里了。但是img2里没有填充图像的地方全都是白色的。显然不合理。
要怎么弄?问题三:
谁可以告诉我Canvas.CopyRect(MyRect,img1.Canvas,MyRect);
以上函数的三个参数分别代码什么意思?
canvas.CopyRect只有这几个参数吗?

解决方案 »

  1.   

    建议看看 delphi数字图像处理及高级应用
      

  2.   

    procedure CopyCutRect(CutRect: TRect);
    var
      tmp: TBitmap;
      dstRect, srcRect: TRect;
      ScaleX, ScaleY: Single;
    begin
        // 如果Image1.Picture.Graphic不是TBitmap,Image1.Canvas是不可使用的,所以作拷贝
        tmp := TBitmap.Create;
        tmp.Assign(Image1.Picture.Graphic);
        // 因为Image显示的与实际Bitmap不见得一致,所以必须对选择矩形进行缩放
        ScaleX := tmp.Width / Image1.Width;
        ScaleY := tmp.Height / Image1.Height;
        srcRect := Rect(Trunc(ScaleX * CutRect.Left),
                        Trunc(ScaleY * CutRect.Top),
                        Round(ScaleX * CutRect.Right),
                        Round(ScaleY * CutRect.Bottom));
        dstRect := srcRect;
        OffsetRect(dstRect, -dstRect.Left, -dstRect.Top);
        Image2.Picture.Bitmap.Width := dstRect.Right;
        Image2.Picture.Bitmap.Height := dstRect.Bottom;
        // 参数:目标矩形,源画布,原矩形
        Image2.Canvas.CopyRect(dstRect, tmp.Canvas, srcRect);
        tmp.Free;
    end;调用:CopyCutRect(Rect(0, 0, 100, 100);
      

  3.   

    调用:CopyCutRect(Rect(0, 0, 100, 100)); 
      

  4.   

    1、将img1的MyRect区域显示到img2,参考:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      image2.Canvas.CopyRect(Rect(0,0,image2.Width,image2.Height),
        image1.Canvas,Rect(0,0,image2.Width,image2.Height));
    end;
    但这只是在image1的picture为bmp的时候适用,jpg的时候报错(Can only modify an image if it contains a bitmap.),其他格式未知,另外当image1使用stretch为true的时候,image2的copyrect的实际显示可能有出入,因为image1经过了缩放,取消stretch的true属性可以一目了然,或者可将image的坐标转换为form的相对坐标来处理合适点,并且在form下处理jpg和bmp都是可以的
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Image2.Canvas.CopyRect(Rect(0,0,image2.Width,image2.Height),
        form1.Canvas,Rect(image1.Left,image1.top,image1.Left+image1.width,image1.top+image1.Height))
    end;2、参考上面13、Canvas.CopyRect大概意思:
    procedure TCanvas.CopyRect(const Dest: TRect; Canvas: TCanvas;
      const Source: TRect);
    意思是说:是指把Canvas画布中的Source区域的内容复制到Dest