将Graphics对象转换为Bitmap

时间:2015-04-21 12:29:21

标签: c# image graphics bitmap

我的图形对象存在以下问题。

修改

我有一个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();
        }
    }

2 个答案:

答案 0 :(得分:3)

正如标题所示,你的主要问题是对Graphics对象是什么的(常见)误解。

到目前为止,我可以毫无问题地绘制到我的图形对象

  • 没有! “Graphics”对象包含任何图形。只有工具用于将图形绘制到相关 Bitmap上。所以你根本没有画上 Graphics对象;你使用它来绘制imageRxTx,无论是什么,可能是某些ControlForm的表面..

  • 这一行使用了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。并非结果包含整体 PictureBoxBackgroundImageImage 表面绘图!

更新:要获取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);
}