Graphics.DrawImage с высоким разрешением 150% + рисует только часть изображения - PullRequest
1 голос
/ 18 октября 2019

Эта проблема возникает в Windows 10 Creators Update или более поздней версии с целевым увеличением 175% или выше .Net 4.7.2. Далее, мы вызываем SetProcessDPIAware в файле Program.cs.

Если мы не вызываем это, тогда шрифты выглядят ужасно при высоком разрешении, особенно при 300%.

static class Program
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        //if (Environment.OSVersion.Version.Major >= 6)
        SetProcessDPIAware();

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

ВАЖНЫЙ ШАГ Мы также перейдем в Расширенные настройки масштабирования и отключим функцию «ПозвольтеWindows пытается исправить приложения, чтобы они не были размыты "... потому что у нас есть пользователи, отключающие это. Изображение настроек Windows

В приведенном ниже приложении у нас есть 3 элемента управления PictureBox. Крайний левый PictureBox является источником, а его изображение представляет собой файл PNG, созданный с разрешением 96 т / д.

Пользователь нажимает кнопку над средним PictureBox, чтобы скопировать исходное изображение в метафайл (используемый в качестве холста для рисования). ) и использует это для заполнения свойства Image среднего PictureBox. В режиме High DPI вы можете видеть, что размер изображения недостаточно велик или что только часть изображения была скопирована в метафайл.

Кнопка над PictureBox в крайнем правом углу копирует исходное изображение с использованием растрового изображения в видехолст для рисования. Он правильно отображает на 175%.

Изображение результатов приложения

Этот код преобразует исходное изображение в метафайл и вставляет его в другой PictureBox.

      private void DrawUsingMetafile()
    {
        try
        {
            Image img = this.pictureBox1.Image;

            Metafile mf = NewMetafile();

            using (Graphics gmf = Graphics.FromImage(mf))
            {
                gmf.DrawImage(img, 0, 0, img.Width, img.Height);
            }

            this.pictureBox2.Image = mf;
        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

}

        public static Metafile NewMetafile()
    {
        using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))  // offscreen device context
        {
            IntPtr hdc = g.GetHdc(); // gets released by g.Dispose() called by using g
            return new Metafile(hdc, EmfType.EmfPlusOnly);
        }
    }

Есть идеи, почему это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...