1

这是我要解决的高级问题...

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

这是迄今为止似乎最有希望的方法......

- -编辑 - -:

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

------

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

我发现的唯一有希望的线索建议使用 Bitmap 构造函数之一,该构造函数将 Graphics 实例作为参数。

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

这是我的代码(经过编辑以将红线绘制到 Graphics 对象):

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();
}

谁能建议为什么这不起作用?这甚至是一种有效的方法吗?

另外,请注意:

据我所知(我已经花了很多时间寻找)没有办法直接从绘图控件获得高分辨率、打印质量的位图

我强调这一点是因为其他几个提出这个问题的人得到了解决相反问题的代码示例——将位图转换为图形。

我需要将Graphics对象转换为Bitmap对象。

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

谢谢,

——汤姆·布谢尔

编辑以回应评论:

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

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

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

4

3 回答 3

1

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

好吧,您从不对图形进行绘画,您期望什么?

您应该为该事件中的输出进行实际绘图。

于 2009-09-16T14:36:40.937 回答
1

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

Graphics g = Graphics.FromImage(bmp);
//Make the background white
g.FillRectangle(Brushes.White, 0, 0, 1000, 1000);
于 2009-09-16T14:53:20.677 回答
1

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

但也许你的做法是错误的。您想要的是创建一个(大)位图,然后“欺骗”控件以使用该位图,就好像它是屏幕一样。请参阅此链接列表
不需要打印文档。

于 2009-09-16T16:53:13.647 回答