Используйте Graphic.DrawLines(Pen Pen, Points points) для метафайла, картинка не может открыться, когда количество точек велико

У меня проблема с метафайлом GDI+. Я хочу сохранить метафайл по графике. Это хорошо работает, когда количество точек составляет 10000, и сохраненный метафайл может быть открыт. Но когда количество точек велико (например, count = 10000000), метафайл не может быть открыт mspaint.exe.

Я что-то пропустил? Ограничен ли размер метафайла? Кстати, drawrectangles также имеет эту проблему.

Вот мой код:

private void button1_Click(object sender, EventArgs e)  
{  
    int width = 1489;  
    int height = 471;

    Graphics offScreenBufferGraphics;
    Metafile m;
    using (MemoryStream stream = new MemoryStream())
    {
        using (offScreenBufferGraphics = Graphics.FromHwndInternal(IntPtr.Zero))
        {
            IntPtr deviceContextHandle = offScreenBufferGraphics.GetHdc();
            m = new Metafile(
            stream,
            deviceContextHandle,
            new RectangleF(0, 0, width, height),
            MetafileFrameUnit.Pixel,
            EmfType.EmfPlusOnly);
            offScreenBufferGraphics.ReleaseHdc();
        }
    }

    using (Graphics g = Graphics.FromImage(m))
    {
        // Set everything to high quality
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.CompositingQuality = CompositingQuality.HighQuality;

        MetafileHeader metafileHeader = m.GetMetafileHeader();
        g.ScaleTransform(
            metafileHeader.DpiX / g.DpiX,
            metafileHeader.DpiY / g.DpiY);

        g.PageUnit = GraphicsUnit.Pixel;
        g.SetClip(new RectangleF(0, 0, width, height));

        // clears the image and colors the entire background
        g.Clear(Color.White);

        // draw lines
        using (Pen pen = new Pen(Color.Black, 1f))
        {
            Random rnd = new Random(DateTime.Now.Millisecond);
            List<PointF> polyPoints = new List<PointF>();
            const int count = 10000;
            for (int i = 1; i <= 10000000; i++)
            {
                polyPoints.Add(new PointF(rnd.Next(1000),rnd.Next(1000)));
            }
            g.DrawLines(pen, polyPoints.ToArray());
            // while
        } // using
    } // using

    // Get a handle to the metafile
    IntPtr iptrMetafileHandle = m.GetHenhmetafile();

    // Export metafile to an image file
    CopyEnhMetaFile(iptrMetafileHandle, @"F:\CacheToDisk\test2.emf");

    // Delete the metafile from memory
    DeleteEnhMetaFile(iptrMetafileHandle);
}

[DllImport("gdi32.dll")]
static extern IntPtr CopyEnhMetaFile(  // Copy EMF to file
    IntPtr hemfSrc,   // Handle to EMF
    String lpszFile // File
);

[DllImport("gdi32.dll")]
static extern int DeleteEnhMetaFile(  // Delete EMF
    IntPtr hemf // Handle to EMF
);

1 ответ

Это похоже на ограничение. Если я использую DrawPath вместо DrawLines, он работает правильно.

Другие вопросы по тегам