2009-01-23 3 views
7

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

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

+0

DPI чего? экран? принтер? ...? –

ответ

7

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

Предполагая, что вам по-прежнему нужен ответ, независимо от его точности, и у вас нет объекта 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); 
+0

Основываясь на запросах пользователя, это должен быть принятый ответ. – epotter

6

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

+0

Итак, если у меня нет доступа к объекту Graphics, как мне рассчитать DPI? – AngryHacker

+0

Решите уравнение для DPI, считая, что остальное известно. – falstro

+0

Как узнать диагональную длину монитора? Мое приложение будет работать на компьютерах, которые я не контролирую. – AngryHacker

1

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

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

+0

Я не могу. Я пишу код в файле с кодом в файле отчета ActiveReports. Он не обладает этими свойствами. – AngryHacker

+0

Он утверждал, что использует WPF, который не является WinForms. Использование двух вместе может вызвать серьезные головные боли. – mmr

+0

@mmr: Нет, он не утверждал, что использует WPF. Фактически, ссылка на «Графика», по-видимому, сильно подразумевает WinForms. В любом случае, спасибо за проголосовавший. – Noldorin