我的图形对象确实有以下问题。
编辑:
我确实有一个picturebox_image(imageRxTx),它是来自相机的实时流。我在绘制事件中所做的是在图像imageRxTx(下面的代码中没有显示)的顶部绘制一些线。到目前为止,这是没有问题的。
现在我需要检查imageRxTx中的圆圈,因此我必须使用需要位图作为参数的方法ProcessImage()。不幸的是,我没有位图图像,而是我的图像RxTx的句柄(hDC)。
问题:如何从图形对象中获取图像RxTx并将其"转换"为位图图像,以便在ProcessImage(位图位图)方法中使用?此方法需要在绘制事件中连续调用,以便检查我的相机的实时流(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();
}
}
正如标题所示,您的主要问题是对Graphics
对象的(常见)误解
到目前为止,我可以毫无问题地绘制到我的图形对象
-
不!"
Graphics
"对象不包含任何图形。它只是用于在相关Bitmap
上绘制图形的工具。所以您根本不需要绘制Graphics
对象;你用它来画imageRxTx
,不管它是什么,可能是一些Control
或Form
的表面。。 -
这一行使用了
Bitmap
构造函数的一种经常令人困惑且毫无用处的格式:
Bitmap bmp = new Bitmap(image_RxTx.Width, image_RxTx.Height, Draw);
最后一个参数是执行,而不是执行任何操作;其唯一的功能是复制CCD_ 9设置。特别是,它不会克隆或复制"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
上的东西绘制到Bitmap
上,则可以使用此方法Sowhere outside(!)thePaint
event:
Bitmap bmp = new Bitmap(image_RxTx.Width, image_RxTx.Height);
image_RxTx.DrawToBitmap(bmp, image_RxTx.ClientRectangle);
这将使用Paint
事件将控件绘制到Bitmap
中。并不是说结果包括整个PictureBox
:BackgroundImage
、Image
和曲面图!
更新:要获得PictureBox
的组合内容,即Image
和您在曲面上绘制的内容,您应该在Timer
的Tick
事件中使用上面的代码(最后两行)或,就在触发Paint
事件的行之后。(你没有告诉我们这是怎么发生的。)你不能直接把它放在Paint
事件本身,因为它会使用Paint
事件,因此会导致无限循环!
方法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);
}