如何在PrintPage事件中将Graphics对象转换为Bitmap对象?

时间:2009-09-16 14:33:01

标签: c# graphics bitmap gdi+ listlabel

这是我试图解决的高级问题......

我有第三方绘图/绘图(IoComp Plot),我想在另一个第三方报告创建的报告中嵌入Plot控件的高质量(至少600 dpi)位图包(Combit List& Label)。

这种方法到目前为止似乎最有希望......

---编辑---:

在尝试了许多其他方法之后,我认为唯一可以使用的方法是创建一个隐藏的Plot控件实例,所有内容都扩展到打印机尺寸(大约是屏幕尺寸的5倍)。这包括宽度和高度,字体大小,线宽 - 控件的每个可见组件。呸!

------

我可以从绘图控件的PrintPage事件中获得正确分辨率的 Graphics 对象,但是将其转换为Bitmap以使报表包很高兴被证明是主要的绊脚石。几个小时的搜索导致其他人提出同样的问题,但没有可行的答案。

我发现的唯一有希望的导致建议使用一个Bitmap构造函数,它将Graphics实例作为参数。

然而,这对我不起作用。它创建了Bitmap,但没有来自Plot控件的内容 - 它是纯黑色图像。

这是我的代码(编辑后显示图形对象的红线图):

void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
{
        // Draw a red line on the Graphics object. When printed, this
        // line is shown as part of the normal Plot graphics.
        Pen myPen;
        myPen = new Pen(Color.Red);
        e.Graphics.DrawLine(myPen, 0, 0, 200, 200);
        myPen.Dispose();

        // Create a bitmap from the Graphics object
        Bitmap bm = new Bitmap(1000, 1000, e.Graphics);

        // Save to disk 
        // DOES NOT WORK - CREATES FILE THAT IS PURE BLACK (VIEWED
        // WITH "PAINT" PROGRAM)
        bm.Save(@"C:\Bicw_Dev\Bic.Net\FrontEnd\GraphicsToBmp.bmp", ImageFormat.Bmp);
        bm.Dispose();
}

任何人都可以建议为什么这不起作用?这甚至是一种有效的方法吗?

另外,请注意:

据我所知(我花了很多时间看)没有办法直接从Plot控件获得高分辨率,打印质量的Bitmap

我强调这一点,因为其他几个问这个问题的人得到了代码样本,以解决相反的问题 - 将Bitmap转换为Graphics。

我需要将图形对象转换为位图对象。

如果有人可以建议一种替代方法,让我能够将我的情节的打印质量图像添加到我的报告中,请随意。 (例如,我可以从Plot控件中获得低质量(72 bpi)位图,并考虑尝试拉伸它 - 但我从未见过这种方法在其他应用程序中运行良好)。

谢谢,

-Tom Bushell

编辑以回应评论:

作为实验,我添加了以下内容:

Pen myPen; 
myPen = new Pen(Color.Red); 
e.Graphics.DrawLine(myPen, 0, 0, 200, 200); 
myPen.Dispose(); 

当我打印我的情节时,这会在绘图图形上绘制一条红线。但它对Bitmap没有影响 - 它仍然是纯黑色。

3 个答案:

答案 0 :(得分:1)

  

然而,这对我不起作用。它   创建Bitmap,但没有内容   来自Plot控件 - 它是纯粹的   黑色图像。

嗯,你永远不会对图形进行绘画,你期待什么?

您可以在该事件中为输出执行实际绘图。

答案 1 :(得分:1)

您正在使用的构造函数不会复制任何图形,只会将分辨率设置为等于图形分辨率。见msdn。正如Leppie指出的那样,你必须在位图上绘制一些东西。我建议为刚刚创建的项目获取另一个图形对象。

Graphics g = Graphics.FromImage(bmp);
//Make the background white
g.FillRectangle(Brushes.White, 0, 0, 1000, 1000);

答案 2 :(得分:1)

在打印(预览)系统中控制DPI并不容易。

但也许你会以错误的方式去做。你想要的是创建一个(大)位图,然后“控制”控件使用该位图,就好像它是屏幕一样。见this list of links
不需要PrintDocument。