Я хочу конвертировать пиксели в дюймы и наоборот. Я понимаю, что мне нужен DPI, но не знаю, как получить эту информацию (например, у меня нет объекта Graphics
, так что это не вариант).
Есть ли способ?
Я хочу конвертировать пиксели в дюймы и наоборот. Я понимаю, что мне нужен DPI, но не знаю, как получить эту информацию (например, у меня нет объекта Graphics
, так что это не вариант).
Есть ли способ?
На видеоустройстве любой ответ на этот вопрос, как правило, не очень точен. Самый простой пример, чтобы понять, почему это так, — это проектор. Выходное разрешение, скажем, 1024x768, но DPI зависит от того, насколько далеко экран находится от отверстия проектора. WPF, например, всегда предполагает 96 точек на дюйм на видеоустройстве.
Предполагая, что вам все еще нужен ответ, независимо от точности, и у вас нет объекта Graphics, вы можете создать его на экране с помощью некоторого 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, сообщите нам, что это за приложение.
Graphic
явно подразумевает WinForms. В любом случае, спасибо за отрицательный голос.
- person Noldorin; 16.07.2009