DPI图形屏幕分辨率像素WinForm PrintPageEventArgs

时间:2011-02-25 20:03:57

标签: c# winforms graphics printing dpi

Dpi Points如何与运行我的应用程序的任何显示器的像素相关?

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 个答案:

答案 0 :(得分:3)

DPI字面意思是“Dots Per Inch” - 其中点==像素。所以要确定1200像素的长度:

int inchesLong = (1200 / e.Graphics.DpiX);

答案 1 :(得分:2)

我意识到已经有几个月了,但在读一本关于WPF的书时,我遇到了答案:

如果使用标准的Windows DPI设置(96 dpi),每个与设备无关的单元对应一个真实的物理像素。

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

因此,96个像素可以通过Windows系统DPI设置一英寸。

但实际上,这取决于您的显示尺寸。

对于设置为1600 x 1200分辨率的19英寸LDC显示器,使用毕达哥拉斯定理有助于计算显示器的像素密度:

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

使用这些数据,我写了一个静态工具,我现在保存在我所有项目的Tools类中:

/// <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;
}

我希望其他人可以使用这个漂亮的小工具。

答案 2 :(得分:1)

对于屏幕:pixels = Graphics.DpiY * points / 72

对于问题主题中提到的打印机,默认情况下,映射为1'像素'== 0.010英寸。这非常接近每英寸96点的默认视频dpi,使得复印在纸上的大小与显示器上看到的相同。

制作表单的屏幕截图并打印它们是一个坏主意。打印机具有更高的分辨率,典型的是600 dpi。当屏幕上的每个像素在纸上变成6x6的斑点时,打印输出将看起来有颗粒感。对于抗锯齿文本尤其明显且难以理解。