将Graphics对象转换为位图



我的图形对象确实有以下问题。

编辑:

我确实有一个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,不管它是什么,可能是一些ControlForm的表面。。

  • 这一行使用了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(!)thePaintevent:

Bitmap bmp = new Bitmap(image_RxTx.Width, image_RxTx.Height);
image_RxTx.DrawToBitmap(bmp, image_RxTx.ClientRectangle);

这将使用Paint事件将控件绘制到Bitmap中。并不是说结果包括整个PictureBox:BackgroundImageImage曲面图!

更新:要获得PictureBox组合内容,即Image和您在曲面上绘制的内容,您应该在TimerTick事件中使用上面的代码(最后两行),就在触发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);
}

相关内容

  • 没有找到相关文章

最新更新