Почему WinForms рисует мое изображение в 4 раза больше?

Я использую WinForms для создания изображения размером 512x512 пикселей с разрешением 96 точек на дюйм. После инициализации я использую OnPaint для рисования этого изображения с помощью Graphics.DrawImage. Когда я запускаю программу, я получаю изображение, показанное ниже: по сути, изображение размером 1024x1024, которое содержит некоторый jung, отдаленно напоминающий то, что я хочу показать, за исключением того, что он состоит из блоков 2x2 пикселя, имеющих одинаковые цвета. Что странно.

Может ли кто-нибудь помочь мне понять, что происходит? Это происходит только на дисплеях с высоким DPI, на обычных программа работает нормально.

введите здесь описание изображения

Обновление 1: я явно устанавливаю процесс без учета DPI с помощью SetProcessDpiAwareness(_Process_DPI_Awareness.Process_DPI_Unaware); и явно вызываю DrawImage в прямоугольнике, т. е.

e.Graphics.DrawImage(bmp, 
      new Rectangle(0, 0, 512, 512), 
      new Rectangle(0, 0, 512, 512), GraphicsUnit.Pixel);

и это не помогло.

Правка 2. После включения включения учета DPI я получаю тот же мусор, но в правильном размере:

введите здесь описание изображения

Изменить 3: Наконец-то понял, что артефакты были результатом моего неправильного рендеринга на стороне CUDA. Вся эта ерунда с высоким разрешением была просто отвлечением.


person Dmitri Nesteruk    schedule 25.02.2016    source источник
comment
Добавьте код, который вы используете для рисования изображения.   -  person CathalMF    schedule 25.02.2016


Ответы (1)


Это происходит только на дисплеях с высоким разрешением.

Это совершенно нормально, вы видите, что изображение масштабируется в соответствии с DPI монитора. Это делает его больше, поэтому размер в дюймах такой же.

Грубый способ сделать это — полагаться на виртуализацию DPI. Windows позволяет вашей программе вести себя так же, как на мониторе с разрешением 96 точек на дюйм, но заставляет ее рисовать в растровое изображение. И масштабирует это растровое изображение, чтобы отобразить его на экране. Довольно грубо, но ваша программа по-прежнему пригодна для использования, качество текста заметно страдает.

Негрубый способ - это когда вы объявили свою программу dpiAware. Теперь Windows больше не помогает, и Graphics.DrawImage() берет на себя эту работу. Он сам по себе масштабирует изображение, чтобы оно соответствовало DPI изображения и DPI дисплея. Текст выглядит очень четко. Изображение, мэм, вы должны отодвинуть свой стул дальше.

Если вы не хотите, чтобы это изменение масштаба происходило, вы должны использовать перегрузку Graphics.DrawImage(), которая принимает аргумент Rectangle. Но имейте в виду, что на таком приятном дисплее изображение превращается в почтовую марку. Придется придвинуть стул поближе :)

person Hans Passant    schedule 25.02.2016
comment
Следовал вашему совету, и это не помогло - такое же поведение после явного отключения поддержки DPI и настройки отображения изображения в определенном прямоугольнике. - person Dmitri Nesteruk; 25.02.2016
comment
Нет смысла отключать поддержку dpi, а затем писать этот код. Странно, что это такая ракетостроение. Похоже, он, вероятно, никогда не был включен в первую очередь. - person Hans Passant; 25.02.2016
comment
Правильно, поэтому я включил учет DPI, и теперь я получаю такое же странное мусорное изображение, но я получаю его в обычном размере. Позвольте мне обновить скриншот... - person Dmitri Nesteruk; 25.02.2016