如何仅将图片框显示的内容捕获为位图,而不使用“从屏幕复制”?

2024-03-11

具体来说:我需要将图片框实际显示的特定区域捕获为位图。该区域的坐标由我覆盖在图片框顶部的控件的边界指定(但该控件属于图片框)。当我制作该区域的“快照”时,该控件被隐藏。

我尝试使用普通的屏幕捕获方法(CopyFromScreen),但您无法真正控制那里的时间。所以它正在捕捉“间隙”状态,就像我的图片框中照片之间的过渡。通常,它仅捕获纯黑色图像(图片框的背景颜色)。

所以我尝试将显示的图像(picturebox.image 属性)转换为位图。问题在于图片框很少能准确显示图像。它显示图像的某些部分,根据其大小模式(即缩放)进行缩放和裁剪。因此,我不能只获取控制坐标并将它们从整个图像中剪切出来。

因此,我尝试估计正在显示图像的哪一部分,并据此纠正我的矩形。事实证明,我基本上是重新创建图片框的“缩放”代码来执行此操作(使用图片框的纵横比、图像的纵横比、猜测图像当前发生的缩放级别(如果图像较大)或小于图片框等)。这并不漂亮。

所以:现在我需要一种仅捕获当前在图片框的客户区域中显示的位图的方法,包括照片和当前在其周围显示的任何黑色“信箱”。有人有吗?

请记住,我不能依赖使用 CopyFromScreen。对于我的目的来说它不够可靠。我想我需要一种获取图片框的方法来告诉我它正在显示的位。


这将复制并保存当前显示的内容PictureBox包括一个BackgroundImage(如果有一个并且它闪耀的话)以及所有Controls属于PictureBox, like Labels等等..还包括在中绘制的元素Paint事件。画的东西outside the Paint事件是非持久还会not被包括在内。

using (Bitmap bmp = new Bitmap(pictureBox1.ClientSize.Width,
                               pictureBox1.ClientSize.Height))
{
   pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);
   bmp.Save(yourfilename, ImageFormat.Png);
}

注意:在我的测试中PicureBox正坐在一个AutoScroll Panel pan_PBscroll。 PictureBox 以 1:1 的比例显示像素,因此,加载照片后,它比面板、表单甚至屏幕大得多。因此,要剪辑到实际可见的部分,我无法使用pictureBox1.ClientSize and pictureBox1.ClientRectangle但使用了该面板的尺寸。这很可能也适用于你。

我不确定你的时间问题。但既然你提到了CopyFromScreen这里有一些区别:

  • CopyFromScreen对每个屏幕像素进行 1:1 复制
  • 这包括非持久性绘图,不包括任何被覆盖或隐藏的内容
  • Control.DrawToBitmap使控件将自身绘制到位图上,就像它在Paint
  • 这排除了不属于该控件但包含其控件集合的所有成员的任何内容
  • 这也排除了非持久性绘图,但包括控件的完整大小,无论它是否适合窗体或屏幕,以及是否隐藏或覆盖。
  • 对于具有活动滚动条的控件,仅复制可见部分。要复制所有内容,您需要暂时调整其大小。然后,即使列表框有一千个项目,您也可以获得完整的图像。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅将图片框显示的内容捕获为位图,而不使用“从屏幕复制”? 的相关文章

  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • 模板与非模板类,跨编译器的不同行为

    我在一些应用程序中使用编译时计数器 它确实很有用 昨天我想用 gcc 编译一个程序 我之前使用的是 msvc 并且计数器的行为在模板类中发生了变化 它在模板类中不再工作 过于简化的代码 Maximum value the counter c
  • 冒号在c中起什么作用?

    我在课堂上得到了这个例子 但我不确定它的作用 我知道冒号添加了一个位字段 但我仍然不确定这个问题 a b gt 0 3 1 运算符称为条件运算符 If b值为 gt 0 价值3被分配给a否则值1被分配给a 以 Kernighan Ritch
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • 如何使固定大小的主体(或div)始终保持在页面的中心(甚至垂直!)

    我试图使 1024x768 的主体始终保持在页面的中心 上下间距相同 左右间距也相同 但是我在执行此操作时遇到了麻烦 我用的是trick距顶部的间距为 50 然后我将主体 绝对 定位在 384px 即 768 的一半 然而这种方法给我带来了
  • Yii 单选按钮

    我在 Yii 中使用单选按钮 无论我做什么 我都无法获取要发布的所选按钮的值 我确信这只是简单的事情 我没有使用 radioButtonList 因为我希望每个按钮都存在于其自己的 div 中 并在其上方有一个图像 这是我从视图中看到的代码
  • 为什么 Scala 在按名称参数重载时的行为与按值参数重载时的行为不同?

    鉴于以下 Scala 代码 object test def byval a Int println Int def byval a Long println Long def byname a gt Int println gt Int d
  • 为什么 [regex] match() 和 -match 不同?

    当我在 PowerShell 中使用正则表达式时 我偶然发现了一个与 Powershell 不同的奇怪场景 regex 班级匹配 match 在我尝试从字符串中删除空行的情况下 当使用 replace我的表情在与时都不起作用 regex r
  • 如何散列 std::string?

    我正在制作一个小实用程序来帮助我通过重复来记住密码 我想每天只输入一次密码 而不是在每次会话之前输入 当然 我不会存储密码本身 但很乐意存储其哈希值 那么 获取哈希值的最简单方法是什么std string使用 C 标准库 对于不涉及外部库的
  • 多重继承和指针实现

    给出以下代码 namespace Example1 class A public A virtual A private float data A class B public B virtual B protected float dat
  • viewpager和fragment中布局的幽灵

    I use the viewpager and fragment the adapter is FragmentStatePagerAdapter fragment s layout i use is SwipeRefreshLayout
  • 分配器类型参数的 C++ 设计模式

    C 03 标准库在将类型传递给旨在作为分配器的类时使用简单的模板类型参数 这是可能的 因为模板在 C 中的工作方式 但是 它并不是很简单 您可能不知道类型定义到底应该是什么样子 特别是在非标准类型的情况下 我认为使用适配器类可能是个好主意
  • vue动态mapGetters

    我有一个 props 我想用它来制作动态 mapGetters 但是 mapGetters 将 props 视为未定义 可能是因为计算值是在 props 之前加载的 有人知道我怎样才能让它变得动态吗 我的代码如下 export defaul
  • 从 VSCode 中删除 git 集成

    我下载了 Visual Studio Code 来在工作中试用 我几乎爱上了它的一切 但我不喜欢的一部分是 Git 集成 我导入了整个工作文件夹 约 14000 个源文件 git 项目 Visual Studio Code 中的布局和所有内
  • 切换大小写奇怪的范围

    在查看一些第 3 方 C 代码时 我遇到了类似的情况 switch state case 0 if c A open brace code break brace not closed case 1 code break close bra
  • python 中的套接字问题

    我有一个用 C 编写的服务器 我想用 python 编写一个客户端 当 python 客户端想要发送文件时 它会发送一个字符串 send some file 后跟文件的内容和字符串 end some file 这是我的客户端代码 file
  • 使用 igraph 在 R 中进行 Louvain 社区检测 - 分配交替的组成员资格分配

    我一直在使用 igraph 在 R 中运行 Louvain 社区检测 感谢我之前查询的这个答案 https stackoverflow com questions 49834827 louvain community detection i
  • jQuery 选择器性能

    我知道我只是对几毫秒的表演时间有强迫症 但我只是想知道为什么以下内容对我来说是正确的 这似乎违背了我的逻辑 我目前有一个 div 它在悬停时淡出内部图像 div someclass hover function this children
  • 如何使用一个文件输入元素上传多个文件

    我正在尝试使用一个文件输入元素使用 html 表单将多个文件上传到云端硬盘 尽管文件选择器允许选择多个文件 但这似乎仅适用于一个文件 回到脚本日志查看器 我只看到我上传的两个文件中捕获的一个文件 这是不受支持的 还是我走错了路 Code g
  • 标记位置更改事件

    我正在使用新的 Android 版 Google 地图 v2 有没有办法为标记位置变化设置监听器 例如 当用户拖动标记时 Quoting 文档 https developers google com maps documentation a
  • R 中 SumIf 函数的等效项是什么

    我是 R 和这个网站的新手 但我搜索后没有找到我正在寻找的答案 如果我有以下数据集 总计 names lt c a b c d a b c d x lt cbind x1 3 x2 c 3 10 total lt data frame na
  • 如何将 JSONP 数据类型与 Ember 数据结合使用?

    如何设置 Ember Data 在进行 ajax 调用时使用 JSONP 数据类型 我将使用 Ember 和 Phonegap 并需要发出跨域请求 覆盖私有的要容易得多ajaxOptions函数而不是使用jQuery 无论如何 Ember
  • 如何在facet_wrap中将label_wrap_gen与as_labeller一起使用

    我有一个方面图 并且想将方面条标题包装在多行上 如果超过一定数量的字符 所以我知道我使用labeller label wrap gen 10 比如包裹超过 10 个字符 当传递给facet wrap不过 我也想传递新的标签 我知道我可以使用
  • 如何仅将图片框显示的内容捕获为位图,而不使用“从屏幕复制”?

    具体来说 我需要将图片框实际显示的特定区域捕获为位图 该区域的坐标由我覆盖在图片框顶部的控件的边界指定 但该控件属于图片框 当我制作该区域的 快照 时 该控件被隐藏 我尝试使用普通的屏幕捕获方法 CopyFromScreen 但您无法真正控