Конвертировать пиксели в дюймы и наоборот в C#
Я ищу, чтобы преобразовать пиксели в дюймы и наоборот. Я понимаю, что мне нужен DPI, но я не уверен, как получить эту информацию (например, у меня нет Graphics
объект, так что это не вариант).
Есть ли способ?
3 ответа
На видеоустройстве любой ответ на этот вопрос обычно не очень точен. Самый простой пример, чтобы понять, почему это так, - это проектор. Разрешение на выходе, скажем, 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, сообщите нам, что это за приложение.