作者:婉里去_ | 来源:互联网 | 2022-10-28 18:12
我想截取页面的截图并将结果放入位图,因为页面上有滚动条,所以我必须截取几个截屏,并且希望合并这些位图。
如果已使用此代码制作了屏幕截图并保存,请执行以下操作:拍摄Delphi 7中特定区域的屏幕截图
我使用此代码从此页面合并它们http://www.delphigroups.info/2/8/309463.html
如果我直接复制它,将导致使用第一个图像,第二个图像是白色矩形。所以我尝试对其进行一些更改,现在我将两个图像都保存在一个文件中。
这是我用来连接位图的代码:
function ConcatenateBitmaps(const MainBitmap: TBitmap; const BitmapToAdd:
TBitmap): TBitmap;
begin
Result := MainBitmap;
If BitmapToAdd.Width > MainBitmap.Width then
Result.Width := BitmapToAdd.Width;
Result.Height := MainBitmap.Height + MainBitmap.Height;
Result.Canvas.CopyRect(
Rect(0,MainBitmap.Height,BitmapToAdd.Width,BitmapToAdd.Height),
BitmapToAdd.Canvas,
Rect(0,0,BitmapToAdd.Width,BitmapToAdd.Height)
);
end;
问题是第二个图像被垂直和水平翻转。
我在这里做错了什么?
编辑:结果的示例,第一个图像是好的,第二个图像是翻转的:
正如我现在所看到的,我的描述是错误的,它在水平方向上是镜像的,在垂直方向上是翻转的
1> GolezTrol..:
原因和快速修复:
问题出在这部分:
Rect(0,MainBitmap.Height,BitmapToAdd.Width,BitmapToAdd.Height)
制作一个矩形,其top
为结果图像的总高度,底部为要添加的位图的高度。因此,此矩形基本上是倒置的(其底部在其顶部上方)。
而且它也可能会变形,因为此矩形的高度不是要添加的位图的高度。
快速修复将是:
Rect(0,Result.Height- BitmapToAdd.Height,BitmapToAdd.Width,Result.Height)
其他问题和困惑:
但我认为造成混淆的原因是因为您认为Result和MainBitmap是两个不同的位图,而实际上它们都是对同一位图的引用。您在一开始所做的分配只是复制引用,而不是实际的TBitmap对象。
另外,您混合使用“高度”和“底部”。TRect希望您设置顶部和底部坐标,而不是顶部和高度。这与先前的问题一起不仅导致位图倒置,而且导致位图将被拉伸并部分覆盖先前的图像。添加的图像越多,效果越清晰。
我个人认为在这种情况下修改现有位图会更有效,主要是因为否则您将不得不一直清理旧的位图,并且拥有一个神奇地创建位图的功能。您会遇到位图对象的所有权问题,随之而来的是存在内存泄漏的风险,这种风险不是很好,尤其是在处理大型位图时。
我建议的版本:
因此,我只是将其设为一个过程,在该过程中,通过向其添加第二个位图来对其进行修改。
在以下版本中,我还使用了Canvas.ClipRect
,它实际上是用于位图的位图的边界矩形。然后我习惯OffsetRect
了“移动”这个矩形(增加其顶部Y和底部Y)。
通过在一个单独的变量中执行此操作,与上面提供的快速修复相比,您可以拥有一个相对较干净的版本,因为您可以在实际修改MainBitmap之前使用其尺寸。
Rect(0,MainBitmap.Height,BitmapToAdd.Width,BitmapToAdd.Height)
并且,如果愿意,您可以使用原始签名创建包装函数,从而创建主图像的副本并返回。但是请注意,MainBitmap和此函数的结果不再是相同的位图,并且必须确保在完成操作后正确释放它们。
Rect(0,Result.Height- BitmapToAdd.Height,BitmapToAdd.Width,Result.Height)
PS:我喜欢这样的问题,可以从中学到一些东西。我从未意识到您可以通过翻转传递给CopyRect的矩形来翻转图像。:D