【问题标题】:DPI Graphics Screen Resolution Pixels WinForm PrintPageEventArgsDPI 图形屏幕分辨率像素 WinForm PrintPageEventArgs
【发布时间】:2011-07-04 13:41:03
【问题描述】:

对于运行我的应用程序的任何显示器,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 像素的长度吗?

【问题讨论】:

  • 注意:一旦我学会了如何通用地显示我的表单,该表单上的数据将被发送到打印机 - 因此标题中的PrintPageEventArgs

标签: c# winforms graphics printing dpi


【解决方案1】:

DPI 字面意思是“每英寸点数”——其中点数==像素。所以要确定1200像素有多长:

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

【讨论】:

  • 视频 dpi 设置永远不会准确。无论显示器大小如何,它们都固定为 96 或 120 或 144。
  • @Hans 不正确。例如,我以 192DPI 测试了我的应用程序。它看起来确实很时髦,但它的扩展性很好!
  • @David - 您是否购买了另一台显示器来匹配该 dpi 设置?需要获得相同的英寸测量值。
  • @Hans 我将我的应用程序显示为 DPIAWARE,然后我想我至少应该强调一下!遗憾的是,您无法购买具有足够像素以使 DPI 设置可行的面板,但如果可以的话,它看起来会很棒。我已经准备好了!!
【解决方案2】:

对于屏幕:像素 = Graphics.DpiY * 点数 / 72

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

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

【讨论】:

  • 实际上,表单只是在将数据发送到打印机之前呈现数据的“打印预览”。该项目应将所有数据绘制到一个表单中,因为它将被发送到打印机。清如泥? :)
  • 但是,先有鸡还是先有蛋?大声笑 - 在我可以使用 MS 的 PrintPreviewDialog 之前,我必须先将对象绘制成 SOMETHING ...除非我遗漏了什么。
  • 呃,你最终想打印它。一旦你得到它,你就可以免费获得预览。反过来做就是浪费时间。实现 PrintDocument.PrintPage 事件处理程序。
  • ...好吧,在这种情况下,我必须创建一个自定义 PrintPreview。我当前的绘画事件将在表单上的面板上发送信息。还将有添加和删除按钮,以将更多“对象”添加到要打印的列表中。
  • 您绘制到设备上下文 (System.Drawing.Graphics)。在 Paint 处理程序或 OnPaint 覆盖中,DC 是通过调用 BeginPaint 获得的,并且是“屏幕 DC”。当您打印时,您会得到一个“打印 DC”。使用 PrintDialog 或 PrintPreviewDialog 时,您提供了一个 PrintDocument 对象。正是在该文档的 PrintPage 事件中,您获得了要绘制的“打印 DC”。
【解决方案3】:

我意识到已经过去几个月了,但是在阅读一本关于 WPF 的书时,我得到了答案:

如果使用标准 Windows DPI 设置 (96 dpi),每个独立于设备的单位对应一个真实的物理像素。

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

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

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

对于设置为 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;
}

我希望其他人能从这个漂亮的小工具中得到一些用处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多