我的图形对象存在以下问题。
修改
我有一个picturebox_image (imageRxTx),这是来自相机的直播。我在绘制事件中所做的是在图像imageRxTx上绘制一些线条(未在下面的代码中显示)。到目前为止这没有问题。
现在我需要检查imageRxTx中的圆圈,因此我必须使用需要Bitmap作为参数的 ProcessImage()方法。不幸的是我没有Bitmap图像,而是把柄(hDC)添加到我的imageRxTx。
问题:如何从我的图形对象中获取imageRxTx并将其“转换”为我需要在方法中使用的位图图像 ProcessImage(位图位图)< / STRONG>?需要在paint-event中连续调用此方法,以便检查我的相机的实时流(imageRxTx)。
这是我的代码:
private void imageRxTx_paint(object sender, PaintEventArgs e)
{
var settings = new Settings();
// Create a local version of the graphics object for the PictureBox.
Graphics Draw = e.Graphics;
IntPtr hDC = Draw.GetHdc(); // Get a handle to image_RxTx.
Draw.ReleaseHdc(hDC); // Release image_RxTx handle.
//Here I need to send the picturebox_image 'image_RxTx' to ProcessImage as Bitmap
AForge.Point center = ProcessImage( ?....? );
}
// Check for circles in the bitmap-image
private AForge.Point ProcessImage(Bitmap bitmap)
{
//at this point I should read the picturebox_image 'image_RxTx'
...
视频图像在此处更新:
private void timer1_Elapsed(object sender, EventArgs e)
{
// If Live and captured image has changed then update the window
if (PIXCI_LIVE && LastCapturedField != pxd_capturedFieldCount(1))
{
LastCapturedField = pxd_capturedFieldCount(1);
image_RxTx.Invalidate();
}
}
答案 0 :(得分:3)
正如标题所示,你的主要问题是对Graphics
对象是什么的(常见)误解。
到目前为止,我可以毫无问题地绘制到我的图形对象
没有! “Graphics
”对象不包含任何图形。只有工具用于将图形绘制到相关 Bitmap
上。所以你根本没有画上 Graphics
对象;你使用它来绘制imageRxTx
,无论是什么,可能是某些Control
或Form
的表面..
这一行使用了Bitmap
constructor常常令人困惑但无用的格式:
Bitmap bmp = new Bitmap(image_RxTx.Width, image_RxTx.Height, Draw);
最后一个参数是无所事事;它唯一的功能是复制Dpi
设置。特别是它不会克隆或复制来自'Draw'的任何内容,正如您现在所知,它不是Graphics
对象,也不是任何其他设置。是的,bmp Bitmap
之后仍然是空的。
如果要绘制到bmp
,则需要使用实际绑定到它的Graphics
对象:
using (Graphics G = Graphics.FromImage(bmp)
{
// draw now..
// to draw an Image img onto the Bitmap use
G.DrawImage(img, ...);
// with the right params for source and destination!
}
无这可能发生在Paint
事件中!但是所有准备代码都不清楚关于你真正想做的事情。你应该解释一下绘图的来源是什么,目标是什么!
如果您希望获得的内容 image_RxTx
到 a Bitmap
,您可以使用此方法 somwhere outside (!) Paint
事件:
Bitmap bmp = new Bitmap(image_RxTx.Width, image_RxTx.Height);
image_RxTx.DrawToBitmap(bmp, image_RxTx.ClientRectangle);
这将使用 Paint
事件将控件绘制为Bitmap
。并非结果包含整体 PictureBox
:BackgroundImage
,Image
和表面绘图!
更新:要获取PictureBox
的组合内容,即Image
和您在地面上绘制的内容,您应该在触发Tick
事件的行之后的Timer
或的Paint
事件中使用上面的代码(最后2行)。 (你没有告诉我们这是怎么发生的。)你不能将它实际放在Paint
事件中,因为它会使用Paint
事件,因此会导致无限循环!
答案 1 :(得分:0)
方法Graphics.CopyFromScreen
可能就是你要找的东西。
var rect = myControl.DisplayRectangle;
var destBitmap = new Bitmap(rect.Width, rect.Height, PixelFormat.Format24bppRgb);
using (var gr = Graphics.FromImage(destBitmap))
{
gr.CopyFromScreen(myControl.PointToScreen(new Point(0, 0)), new Point(0, 0), rect.Size);
}