Конвертировать пиксели в дюймы и наоборот в C # - PullRequest
8 голосов
/ 24 января 2009

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

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

Ответы [ 3 ]

7 голосов
/ 24 января 2009

На видеоустройстве любой ответ на этот вопрос обычно не очень точен. Самый простой пример, чтобы понять, почему это так, - это проектор. Разрешение на выходе, скажем, 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);
6 голосов
/ 24 января 2009

Физически, нет реального пути без знания 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 вашего принтера (или, точнее, текущие настройки принтера).

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

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

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

...