GDI+ metafile
От: Bigchief  
Дата: 08.11.05 18:22
Оценка:
Hi All!

Метафайлы в GDI+ это что-то!
Мало того, что вспотеешь их сохранять, так еще и нарисовать точно не получается!

Казалось бы — чего проще — создать картинку 10х10 и в ней 2 линии длиной 10 (это тестовый пример, который я создал изучая искажения в своём рисовании)

Описываю пример:
Создается метафайл 10х10 дюймов. Рисуестся 3 горизонтальных полоски от 0 до 10, 9, 8; 3 вертикальные полоски от 0 до 10, 9, 8 (все в дюймах)
Потом то же делается для пикселей, милиметров, поинтов,...
Результаты везде разные — либо линии уходят в горизонт либо не достают до края.

Теперь вопрос — что делать? Куда крестьянину податься? Как нарисовать точно (precisely)?


void DrawStrips(Graphics g1)
    {
      g1.DrawLine(Pens.Green, 0F, 1F, 10F, 1F);
      g1.DrawLine(Pens.Green, 0F, 3F, 9F, 3F);
      g1.DrawLine(Pens.Green, 0F, 5F, 8F, 5F);
      g1.DrawLine(Pens.GreenYellow, 1f, 0f, 1f, 10f);
      g1.DrawLine(Pens.GreenYellow, 3f, 0f, 3f, 9f);
      g1.DrawLine(Pens.GreenYellow, 5f, 0f, 5f, 8f);
    }
    private void menuItem4_Click(object sender, System.EventArgs e)
    {
      RectangleF frame = new RectangleF(0f, 0f, 10f, 10f);
      Metafile mf;
      Graphics g1;

      using(Graphics gr = CreateGraphics())
      {
        IntPtr dc = gr.GetHdc();
        mf = new Metafile("c:\\document.emf", dc, frame, MetafileFrameUnit.Document, EmfType.EmfOnly);
        gr.ReleaseHdc(dc);
      }
      g1 = Graphics.FromImage(mf);
      g1.PageUnit = GraphicsUnit.Document;
      DrawStrips(g1);
      g1.Dispose();
      mf.Dispose();

      using(Graphics gr = CreateGraphics())
      {
        IntPtr dc = gr.GetHdc();
        mf = new Metafile("c:\\inch.emf", dc, frame, MetafileFrameUnit.Inch, EmfType.EmfOnly);
        gr.ReleaseHdc(dc);
      }
      g1 = Graphics.FromImage(mf);
      g1.PageUnit = GraphicsUnit.Inch;
      DrawStrips(g1);
      g1.Dispose();
      mf.Dispose();

      using(Graphics gr = CreateGraphics())
      {
        IntPtr dc = gr.GetHdc();
        mf = new Metafile("c:\\milimeter.emf", dc, frame, MetafileFrameUnit.Millimeter, EmfType.EmfOnly);
        gr.ReleaseHdc(dc);
      }
      g1 = Graphics.FromImage(mf);
      g1.PageUnit = GraphicsUnit.Millimeter;
      DrawStrips(g1);
      g1.Dispose();
      mf.Dispose();

      using(Graphics gr = CreateGraphics())
      {
        IntPtr dc = gr.GetHdc();
        mf = new Metafile("c:\\pixel.emf", dc, frame, MetafileFrameUnit.Pixel, EmfType.EmfOnly);
        gr.ReleaseHdc(dc);
      }
      g1 = Graphics.FromImage(mf);
      g1.PageUnit = GraphicsUnit.Pixel;
      DrawStrips(g1);
      g1.Dispose();
      mf.Dispose();

      using(Graphics gr = CreateGraphics())
      {
        IntPtr dc = gr.GetHdc();
        mf = new Metafile("c:\\point.emf", dc, frame, MetafileFrameUnit.Point, EmfType.EmfOnly);
        gr.ReleaseHdc(dc);
      }
      g1 = Graphics.FromImage(mf);
      g1.PageUnit = GraphicsUnit.Point;
      DrawStrips(g1);
      g1.Dispose();
      mf.Dispose();
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.