如何在不使用“从屏幕上复制”的情况下,仅将位图捕获为图像框显示的内容?
具体来说:我需要捕获图片框实际显示的特定区域作为位图。 区域的坐标由我已覆盖在图片框顶部的控件的边界指定(但属于图片框)。 当我制作区域的“快照”时,控件被隐藏。
我尝试使用普通的屏幕捕获方法(CopyFromScreen),但你无法真正控制那里的时间。 所以它正在捕捉“插页式”状态,比如我的图片框中的照片之间的过渡。 它经常只捕获纯黑色图像(图片框的背景颜色)。
所以我尝试将显示的图像(picturebox.image属性)转换为位图。 问题是图片框很少显示图像。 它显示了一些图像的部分,根据它的尺寸模式(缩放)进行缩放和剪裁。 所以我不能只拿走我的控制坐标并将它们从整个图像中剪切掉。
所以我试着估计图像的哪个部分正在显示,并根据它来修正我的矩形。 事实certificate,我基本上是在重新创建图片框的“缩放”代码来实现这一点(使用图片框的宽高比,图像的宽高比,猜测图像当前正在发生什么级别的缩放,如果它更大或小于图片框等)。 它不漂亮。
所以:现在我需要一种只捕获当前正在图片框的客户区显示的位图的方法,包括照片和当前正在其周围显示的任何黑色“信箱”。 有人有吗?
请记住,我不能依赖使用CopyFromScreen。 它对我的目的来说不够可靠。 我想我需要一种获取图片框的方法来告诉我它正在显示的位。
这将复制并保存PictureBox
当前显示的内容,包括BackgroundImage
(如果有一个,如果它通过),以及属于PictureBox
所有Controls
,如Labels
等。还包括在Paint
事件中绘制的元素。 在Paint
事件之外 Paint
的内容是非持久性的 , 不会包含在内。
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
和pictureBox1.ClientRectangle
但使用了该Panel的尺寸。 这也可能适用于您。
我不确定你的时间问题。 但既然你提到CopyFromScreen
这里有一些区别:
既然你正在使用PictureBox我会说看看PictureBox.Image你可以获取Bitmap对象 。
希望能帮助到你。
上述就是C#学习教程:如何在不使用“从屏幕上复制”的情况下,仅将位图捕获为图像框显示的内容?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/958664.html