热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么CopyRect在delphi10.3中翻转了第二张图像?

如何解决《为什么CopyRect在delphi10.3中翻转了第二张图像?》经验,为你挑选了1个好方法。

我想截取页面的截图并将结果放入位图,因为页面上有滚动条,所以我必须截取几个截屏,并且希望合并这些位图。

如果已使用此代码制作了屏幕截图并保存,请执行以下操作:拍摄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


推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
author-avatar
婉里去_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有