Вопрос

Я хочу преобразовать пиксели в дюймы и наоборот. Я понимаю, что мне нужен DPI, но я не уверен, как получить эту информацию (например, у меня нет объекта Graphics, так что это не вариант).

Есть ли способ?

Это было полезно?

Решение

На видеоустройстве любой ответ на этот вопрос обычно не очень точен. Самый простой пример, чтобы понять, почему это так, - это проектор. Разрешение на выходе, скажем, 1024x768, но значение DPI зависит от того, насколько далеко экран находится от проектора. WPF, например, всегда предполагает 96 DPI на видеоустройстве.

Предполагая, что вам все еще нужен ответ, независимо от точности, и у вас нет графического объекта, вы можете создать его с экрана с помощью P / Invoke и получить ответ от него.

Single xDpi, yDpi;

IntPtr dc = GetDC(IntPtr.Zero);

using(Graphics g = Graphics.FromHdc(dc))
{
    xDpi = g.DpiX;
    yDpi = g.DpiY;
}

if (ReleaseDC(IntPtr.Zero) != 0)
{
    // GetLastError and handle...
}


[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr hwnd);    
[DllImport("user32.dll")]
private static extern Int32 ReleaseDC(IntPtr hwnd);

Другие советы

Физически, нет реального пути без знания DPI. Пиксели являются дискретными, а дюймы - нет, если вы говорите на мониторе дюймы, вам нужно знать (как минимум) разрешение (и соотношение сторон пикселей) и размер видимой области монитора, чтобы рассчитать ваш DPI , Разрешение обычно можно получить где-нибудь (я не программист на C # или .NET, поэтому не могу вам помочь), но размер монитора обычно недоступен. Если оценка достаточно хорошая, попросите пользователя ввести размер монитора (т. Е. 21 & Или что-то еще) и решить для DPI:

(resX/DPI)^2 + (resY/DPI)^2 = screenDiagonal^2

предоставление (при условии, что вы знаете диагональ и разрешение)

DPI = sqrt(resX^2+resY^2)/screenDiagonal

Это всего лишь приблизительная оценка, поскольку мониторы никогда не бывают точно 21 " (... или что-то еще), и соотношение сторон пикселя едва ли будет ровно 1: 1.

Если вы говорите на бумаге дюймы, то, естественно, вам нужно знать DPI вашего принтера (или, точнее, текущие настройки принтера).

Вы можете создать объект Graphics, просто вызвав this.CreateGraphics() (или, в более общем случае, Control.CreateGraphics()), а затем использовать свойства DpiX и DpiY, как вам кажется. Просто не забудьте утилизировать графический объект после его создания (в идеале с помощью оператора Using).

Если вы не используете WinForms, сообщите нам, что это за приложение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top