DPI Graphics Screen Resolution Pixels WinForm PrintPageEventArgs

匿名 (未验证) 提交于 2019-12-03 01:20:02

问题:

How do Dpi Points relate to Pixels for any display my application is running on?

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

Do I now have all of the information I need?

Can I use any of the information above to find out just how long 1200 pixels is?

回答1:

DPI literally stands for "Dots Per Inch" - where dots==pixels. So to determine how long 1200 pixels is:

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


回答2:

I realize it has been a few months, but while reading a book on WPF, I came across the answer:

If using standard Windows DPI setting (96 dpi), each device-independent unit corresponds to one real, physical pixel.

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

Hence, 96 pixels to make an inch through the Windows system DPI settings.

However, this does, in reality, depend on your display size.

For a 19-inch LDC monitor set to a resolution of 1600 x 1200, use the Pythagoras theorem helps to calculate pixel density for the monitor:

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

Using this data, I wrote up a little static tool that I now keep in my Tools class of all my projects:

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

I hope others get some use out of this nifty little tool.



回答3:

For the screen: pixels = Graphics.DpiY * points / 72

For the printer, mentioned in your question subject, mapping is 1 'pixel' == 0.010 inches by default. This is quite close to the default video dpi of 96 dots per inch making the copy on paper about the same size as what you see on the monitor.

Making screen shots of your form and printing them is a bad idea. Printers have much higher resolutions, 600 dpi is typical. The printout will look grainy as each pixel on the screen becomes a 6x6 blob on paper. Especially noticeable and fugly for anti-aliased text.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!