Как определить истинный размер пикселя моего монитора в .NET? - PullRequest
9 голосов
/ 08 января 2009

Я хочу отобразить изображение в «истинном размере» в моем приложении. Для этого мне нужно знать размер пикселя дисплея.

Я знаю, что разрешение экрана Windows номинально составляет 96 точек на дюйм, но для моих целей я хочу лучше угадать. Я понимаю, что эта информация не всегда может быть доступной или точной (например, старые ЭЛТ-дисплеи), но я полагаю, что при использовании ЖК-дисплеев это возможно!

Есть ли способ получить размер пикселя моего дисплея?

Есть ли способ определить, точен ли размер пикселя?

.NET API предпочтительнее (я не смог их найти), но с Win32 тоже все в порядке, я рад P / Invoke.

Ответы [ 5 ]

28 голосов
/ 08 января 2009

Для размера дисплея вам понадобится Screen.PrimaryScreen.Bounds.Size (или Screen.GetBounds(myform)).

Если вы хотите установить DPI, используйте свойства DpiX и DpiY Графика :

PointF dpi = PointF.Empty;
using(Graphics g = this.CreateGraphics()){
    dpi.X = g.DpiX;
    dpi.Y = g.DpiY;
}

Ой, подожди! Вы хотели актуальный, поднесите линейку к монитору и измерьте размер ?! Нет. Использование любых служб ОС невозможно. ОС не знает фактических размеров монитора или того, как пользователь его откалибровал. Часть этой информации теоретически обнаружима, но она недостаточно детерминирована для того, чтобы операционная система использовала ее надежно, поэтому она этого не делает.

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

  • Вы можете попытаться запросить строку отображения установленного устройства монитора (я не уверен, как это сделать) и посмотреть, сможете ли вы разобрать разумный размер из этого. Например, монитор может быть «ValueBin E17p», и вы могли бы сделать вывод, что это 17-дюймовый монитор из этого. Конечно, эта строка отображения, вероятно, будет «Монитор Plug and Play». Схема довольно схематична в лучшем случае.
  • Вы можете спросить пользователя, какой у него размер монитора. Может быть они узнают.

Как только вы знаете (или думаете знаете) размер диагонали монитора, вам нужно найти его физическое соотношение сторон. Опять пара вещей:

  • Предположим, что текущее соотношение сторон в пикселях соответствует физическому соотношению сторон монитора. Это предполагает, что (A) пользователь выбрал разрешение, которое идеально подходит для его монитора, и что (B) монитор имеет квадратные пиксели. Я не знаю современного компьютерного монитора, ориентированного на потребителя, у которого нет квадратных пикселей, но у старых он есть, а у более новых -
  • Спросите пользователя. Может быть они узнают.

Как только вы знаете (или думаете вы знаете), каковы размеры диагонали монитора и физическое соотношение сторон, вы можете вычислить его физическую ширину и высоту. A 2 + B 2 = C 2 , поэтому несколько вычислений принесут вам пользу:

Если вы узнали, что это 17-дюймовый монитор, и его текущее разрешение составляет 1280 x 1024:
1280 2 + 1024 2 = 2686976
Sqrt (2686976) = 1639,1998047828092637409837247032
17 "* 1280 / 1639,2 = 13,274768179599804782820888238165"
17 "* 1024 / 1639,2 = 10,619814543679843826256710590532"

Это устанавливает физическую ширину в 13,27 дюйма и физическую высоту в 10,62 дюйма. Это делает пиксели 13,27 "/ 1280 = 10,62" / 1024 = 0,01037 "или примерно 0,263 мм.

Конечно, все это недопустимо, если у пользователя нет подходящего разрешения, монитор имеет дурацкие неквадратные пиксели, или это более старый аналоговый монитор, и элементы управления не настроены должным образом для заполнения дисплея весь физический экран. Или, что еще хуже, это может быть проектор.

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

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

Независимо от того, что вы делаете , не ожидайте, что ваши результаты будут на 100% точными. Существует слишком много факторов для вас (или пользователя), чтобы каждый раз получать это точно.

Имейте в виду, что 96 точек на дюйм обычно довольно близко к точности. Современные пиксели на непроецируемых экранах имеют тенденцию быть около 0,25 мм, сдаваемые или сдаваемые, поэтому обычно получается, что около 100 физических пикселей на дюйм, отдача или взятие, если монитор установлен в исходное разрешающая способность. (Конечно, это огромное обобщение, и не применимо ко всем мониторам. Например, Eee PC имеет пиксели размером около 0,19 мм, если я правильно помню спецификации.)

1 голос
/ 08 января 2009

Вы можете проверить, просто вручную рассчитав размер экрана

cos(45)*LCD_SCREEN_DIAGONAL_IN_INCHES/sqrt(HORZ_RES^2 + VERT_RES^2)

Это даст вам ширину пикселя в дюймах

1 голос
/ 08 января 2009

GetDeviceCaps может быть P / Invoke'd, чтобы получить некоторые цифры, но я никогда не знал, что цифры заслуживают доверия ...

1 голос
/ 08 января 2009

извините, вы получили P / Invoke для получения этой информации.

Вот ссылка, которую я использовал для этого некоторое время назад: http://www.davidthielen.info/programming/2007/05/get_screen_dpi_.html

0 голосов
/ 08 сентября 2010

Вы можете получить физические размеры дисплея, используя информацию EDID, хранящуюся в реестре. Вы можете получить соответствующий раздел реестра монитора с помощью вызова API окон EnumDisplayDevices.

Физические размеры объекта "Экран" :

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