Delphi使用CopyRect从bmp到image

时间:2017-09-03 11:37:50

标签: image delphi canvas

我有这样的代码

source.Picture.LoadFromFile(fName);  
buffer.Assign(source.Picture.Bitmap);     
buffer.Canvas.CopyRect(rect(0,0,buffer.Width,buffer.Height), target.Canvas, rect(0,0,buffer.Width,buffer.Height));

它不会起作用。 有更好的方法来加载图像,但我想玩它们。 主要原因是加载较小的图像, 所以复制canvas rect是正确的,但它没有显示单个像素...

对象被初始化和缩放,除了我想要包含多个图像的目标。 我认为没有必要编写什么类型的对象,所有需要的是类程序,显示什么是什么。

我不知道什么是错的?我尝试了很多方法,但没什么简单的。 请帮忙。

1 个答案:

答案 0 :(得分:3)

可能来源是TImage,缓冲区是TBitmap,目标也是TImage(你应该在你的问题中提及它,所以我们不必猜测)。

在这种情况下,第二行仅在从.BMP加载时才起作用,因为只有这些行填充了位图。如果您使用.png或.jpeg,第二行将删除实际图片并将其替换为空位图...不是非常直观的行为,但它是documented at least

要使用任意图形,您应该使用TCanvas.Draw方法,然后调用TGraphic.Draw()。从描述中可以看出,它会将您加载到画布中的图形绘制为给定的矩形。这样的事情:

source.Picture.LoadFromFile(fName);
target.Canvas.Draw(0, 0, source.Picture.Graphic);

UPD。

如果你想缩放任意图片,可以这样做:

source.picture.loadFromFile(fName);
buffer.Width := source.picture.Width;
buffer.Height := source.picture.Height;
buffer.PixelFormat := pf24bit;
buffer.Canvas.Draw(0, 0, source.picture.Graphic);
//so we at last have bitmap containing our image in original size

target.Canvas.CopyRect(Rect(0, 0, NewWidth, NewHeight), buffer.canvas, Rect(0, 0, buffer.Width, buffer.Height));

这里NewWidth和NewHeight是我们想要的图像尺寸。

顺便说一下,如果它只是从文件加载的临时对象,则不需要source: TImageTPicture就足够了:

var pic: TPicture;

pic := TPicture.Create;
try
  pic.LoadFromFile(fName);
  ...
  buffer.Canvas.Draw(0, 0, pic.Graphic);
finally
  pic.free;
end;