如何在Delphi中使用CopyRect方法
我正在从磁盘加载一个映像,并希望将其(部分)复制到第二个映像:如何在Delphi中使用CopyRect方法,delphi,Delphi,我正在从磁盘加载一个映像,并希望将其(部分)复制到第二个映像: Image1.Picture.LoadFromFile(S); with Image1.Picture.Bitmap do Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect); Image2只显示一个白色矩形,Image1不显示来自磁盘的文件。如果我删除第二条语句,Image1将显示该图像。(最奇怪的是:如果我只注释掉CopyRect语
Image1.Picture.LoadFromFile(S);
with Image1.Picture.Bitmap do
Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect);
Image2只显示一个白色矩形,Image1不显示来自磁盘的文件。如果我删除第二条语句,Image1将显示该图像。(最奇怪的是:如果我只注释掉CopyRect语句并保留“with”行(空语句),那么Image1也不会显示!)
如何使用CopyRect复制图像的一部分
编辑当我将这两个语句拆分为两个单独的操作(按钮)时,会发生以下情况:
顺便说一句,我使用的是Delphi 2009。
TCanvas.CopyRect
使用StretchBlt
复制矩形。StretchBlt需要位图。如果要将任何其他图形类型加载到图像中,则其Picture.Bitmap
为空。实际上,位图是在您引用它时创建的:使用Image1.Picture.bitmap do
您可以使用临时位图,原因如下:
var
Bmp: TBitmap;
begin
Image1.Picture.LoadFromFile(S);
Bmp := TBitmap.Create;
try
Bmp.Assign(Image1.Picture.Graphic);
with Bmp do
Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect);
finally
Bmp.Free;
..
我复制粘贴了你的代码,对我来说效果很好。尝试分离这两个语句(在两个按钮中),看看发生了什么:Image1.Picture.Bitmap强制图形类型保留“位图”。如果
Image1.Picture
还不是位图(虽然问题中缺少了位图,但看起来是这样),则图形将释放它并创建一个位图。@Magicmaster-谢谢,但似乎不起作用。我补充了我的问题。这就是为什么@Magic的代码起作用,他正在加载一个“位图”。@stevenvh:文件名是什么?特别是,文件扩展名是什么?它是‘bmp’、‘png’、‘jpg’、?谢谢,这就解决了。现在我只需要把颜色弄对:-(