Создайте метафайл в C# с указанными c размерами в миллиметрах, затем нарисуйте растровое изображение и прямоугольник - PullRequest
0 голосов
/ 10 апреля 2020

Меня смущает создание метафайла и его размеры при рисовании на нем изображений и прямоугольников.

У меня есть растровое изображение определенного размера (1010 x 761 пикселей при 96 DPI), которое я в конечном итоге хочу обернуть в изображение EMF шириной 100 мм с пропорциональной высотой (которая оказывается равной 120 мм) и также нарисуйте над ним прямоугольник в известном мне месте относительно размеров растрового пикселя (например, при 50,50 x 100 100).

Следующий код используется для создания метафайла нужных размеров в мм и Графический объект для последующего рисования:

var size = new Size(160,120);
using (var offScreenBufferGraphics = Graphics.FromHwndInternal(IntPtr.Zero))
{
    IntPtr deviceContextHandle = offScreenBufferGraphics.GetHdc();
    try
    {
        Metafile = new Metafile(stream, deviceContextHandle, new RectangleF(0, 0, size.Width, size.Height), MetafileFrameUnit.Millimeter, EmfType.EmfPlusOnly);
    }
    finally
    {
        offScreenBufferGraphics.ReleaseHdc();
    }
}

graphics = Graphics.FromImage(Metafile);

Однако, когда я пытаюсь нарисовать растровое изображение, а также прямоугольник на графике, размеры кажутся чрезвычайно странными.

Следующий код пытался нарисовать растровое изображение для заполнения всей EMF:

var sourceBitmap = Image.FromFile(@"C:\temp\example.png");
var srcRect = new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height);
var dstRect = new Rectangle(0, 0, size.Width, size.Height  );
graphics.PageUnit = GraphicsUnit.Millimeter;
graphics.DrawImage(sourceBitmap, dstRect, srcRect, GraphicsUnit.Pixel);

Однако растровое изображение не заполняет всю EMF (см. Результат ниже).

Кроме того, мне неясно, что указывать в виде прямоугольника при попытке закрасить прямоугольник над растровым изображением в заданной позиции. Следующий код не работает:

graphics.PageUnit = GraphicsUnit.Millimeter;
graphics.DrawRectangle(new Pen(Color.Red, 3.0f), new Rectangle(50, 50, 100, 100));

Вот вывод моих попыток: синяя рамка обозначает растровое изображение, которое, очевидно, не заполняет ЭДС. Зеленый прямоугольник - то, где должен быть нарисованный прямоугольник.

Я действительно потерян здесь. Что я делаю не так?

enter image description here

...