DPI Графика экрана Разрешение пикселей WinForm PrintPageEventArgs - PullRequest
5 голосов
/ 25 февраля 2011

Как точки Dpi соотносятся с пикселями для любого дисплея, на котором запущено мое приложение?

int points;
Screen primary;

public Form1() {
  InitializeComponent();
  points = -1;
  primary = null;
}

void OnPaint(object sender, PaintEventArgs e) {
  if (points < 0) {
    points = (int)(e.Graphics.DpiX / 72.0F); // There are 72 points per inch
  }
  if (primary == null) {
    primary = Screen.PrimaryScreen;
    Console.WriteLine(primary.WorkingArea.Height);
    Console.WriteLine(primary.WorkingArea.Width);
    Console.WriteLine(primary.BitsPerPixel);
  }
}

Имею ли я теперь всю необходимую информацию?

Могу ли я использовать любой изинформация выше, чтобы узнать, какова длина 1200 пикселей?

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

DPI буквально означает «точек на дюйм» - где точки == пикселей.Итак, чтобы определить, какова длина 1200 пикселей:

int inchesLong = (1200 / e.Graphics.DpiX);
2 голосов
/ 17 мая 2011

Я понимаю, что прошло несколько месяцев, но, читая книгу по WPF, я натолкнулся на ответ:

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

[Physical Unit Size] = [Device-Independent Unit Size] x [System DPI]
                     = 1/96 inch x 96 dpi
                     = 1 pixel

Следовательно, 96 пикселей на дюйм при настройках DPI системы Windows.

Однако в действительности это зависит от размера вашего дисплея.

Для 19-дюймового монитора LDC с разрешением 1600 x 1200 используйте теорему Пифагора, которая помогает рассчитать плотность пикселей для монитора:

[Screen DPI] = Math.Sqrt(Math.Pow(1600, 2) + Math.Pow(1200, 2)) / 19

Используя эти данные, я написалнебольшой статический инструмент, который я сейчас храню в своем классе инструментов всех моих проектов:

/// <summary>
/// Calculates the Screen Dots Per Inch of a Display Monitor
/// </summary>
/// <param name="monitorSize">Size, in inches</param>
/// <param name="resolutionWidth">width resolution, in pixels</param>
/// <param name="resolutionHeight">height resolution, in pixels</param>
/// <returns>double presision value indicating the Screen Dots Per Inch</returns>
public static double ScreenDPI(int monitorSize, int resolutionWidth, int resolutionHeight) {
  //int resolutionWidth = 1600;
  //int resolutionHeight = 1200;
  //int monitorSize = 19;
  if (0 < monitorSize) {
    double screenDpi = Math.Sqrt(Math.Pow(resolutionWidth, 2) + Math.Pow(resolutionHeight, 2)) / monitorSize;
    return screenDpi;
  }
  return 0;
}

Я надеюсь, что другие получат некоторую пользу от этого изящного маленького инструмента.

1 голос
/ 25 февраля 2011

Для экрана: пиксели = Graphics.DpiY * points / 72

Для принтера, упомянутого в теме вашего вопроса, отображение составляет 1 пиксель == 0,010 дюйма по умолчанию.Это очень близко к стандартному разрешению видео 96 точек на дюйм, что делает копию на бумаге того же размера, что и на мониторе.

Создание снимков экрана с вашей формой и их печать - плохая идея,Принтеры имеют гораздо более высокое разрешение, обычно 600 точек на дюйм.Распечатка будет выглядеть зернистой, поскольку каждый пиксель на экране становится каплей 6х6 на бумаге.Особенно заметно и беспорядочно для сглаженного текста.

...