我有这样的代码
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是正确的,但它没有显示单个像素...
对象被初始化和缩放,除了我想要包含多个图像的目标。 我认为没有必要编写什么类型的对象,所有需要的是类程序,显示什么是什么。
我不知道什么是错的?我尝试了很多方法,但没什么简单的。 请帮忙。
答案 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: TImage
。 TPicture
就足够了:
var pic: TPicture;
pic := TPicture.Create;
try
pic.LoadFromFile(fName);
...
buffer.Canvas.Draw(0, 0, pic.Graphic);
finally
pic.free;
end;