代码之家  ›  专栏  ›  技术社区  ›  Matt Burland

生成多个图形对象以并行使用

  •  -1
  • Matt Burland  · 技术社区  · 8 年前

    我试图创建一个图形对象,我可以用来绘制一个元文件,我不知道什么是最好的方式来做。最终,这些元文件将包含在Word文档中,我们希望它们在打印时看起来很好。

    起初我有这样的经历:

    var ms = new MemoryStream();
    using (var mfG = System.Drawing.Graphics.FromHwndInternal(IntPtr.Zero))
    using (Metafile mf = new Metafile(ms, mfG.GetHdc(), EmfType.EmfPlusOnly, "Chart"))
    using (var g = System.Drawing.Graphics.FromImage(mf))
    {
        // do some drawing 
    }
    

    所以我试着(基于一些关于创建图形对象的在线建议):

    using (var mfG = new System.Drawing.Printing.PrinterSettings().CreateMeasurementGraphics())
    

    但它仍然有同样的问题。显然 CreateMeasurementGraphics

    我可以用 lock 使其他线程等待。也许我应该。但是有没有更好的方法来产生独立性 Graphics

    1 回复  |  直到 8 年前
        1
  •  0
  •   Thomas Voß    8 年前

    我不知道,我的回答是否对你有帮助,但你不能从多个线程绘制同一个图形对象。

    你能做的:你可以用一个链接的图形对象创建多个图元文件,你可以并行地绘制到不同的文件。显然,每个线程都必须使用自己的图元文件<->图形二重奏。

    最后,您可以使用单个图形对象和“DrawImageUnscaled”方法组合图像。

    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace MetaFileDrawTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                Pen[] p = new Pen[] { Pens.Black, Pens.Red, Pens.Green };
                // Draw to three MetaFiles in Parallel.
                Parallel.For(0, 3, i =>
                {
                    using (var ms = new MemoryStream())
                    {
                        using (var mfG = System.Drawing.Graphics.FromHwndInternal(IntPtr.Zero))
                        {
                            using (Metafile mf = new Metafile(ms, mfG.GetHdc(), EmfType.EmfPlusOnly, "Chart"))
                            {
                                using (var g = System.Drawing.Graphics.FromImage(mf))
                                {
                                    // Draw a slightly different line each time to see a difference...
                                    g.DrawLine(p[i], 10 * i, 10, 100, 100);
                                }
    
                                // Save the Metafile to the disc. (You might keep it in memory as well)
                                mf.Save("D:\\test" + i + ".wmf");
                            }
                        }
                    }
                });
    
                // Draw the three metafiles to the form (just to see how they look like)
                for (int i = 0; i <= 2; i++)
                {
                    e.Graphics.TranslateTransform(100 * (i + 1), 0);
                    e.Graphics.DrawImageUnscaled(Image.FromFile("D:\\test" + i + ".wmf"), 0, 0);
                    e.Graphics.ResetTransform();
                }
    
                // Create a file metafile to draw all single images to (one by one)
                using (var ms2 = new MemoryStream())
                {
                    using (var mfG = System.Drawing.Graphics.FromHwndInternal(IntPtr.Zero))
                    {
                        using (Metafile mf = new Metafile(ms2, mfG.GetHdc(), EmfType.EmfPlusOnly, "Chart"))
                        {
                            using (var g = System.Drawing.Graphics.FromImage(mf))
                            {
                                g.DrawImageUnscaled(Image.FromFile("D:\\test0.wmf"), 0, 0);  
                                g.DrawImageUnscaled(Image.FromFile("D:\\test1.wmf"), 0, 0);
                                g.DrawImageUnscaled(Image.FromFile("D:\\test2.wmf"), 0, 0);
                            }
                            // Save the combined file to disc
                            mf.Save("D:\\complete.wmf");
                            // draw the combined file to the form.
                            e.Graphics.DrawImageUnscaled(mf, 0, 0);
                        }
                    }
                }
            }
        }