c# 刻度:毫米 英寸 像素轉換


從目前所掌握的資料來看,c#程序中將毫米轉換像素的方法無非兩種:

第一種:

   1: /// <summary>
   2: /// 以毫米為單位的顯示寬度
   3: /// </summary>
   4: const int HORZSIZE = 4;
   5: /// <summary>
   6: /// 以像素為單位的顯示寬度 0~65535
   7: /// </summary>
   8: const int HORZRES = 8;
   9: const int LOGPIXELSX = 88;
  10: const int LOGPIXELSY = 90;
  11: public static double MillimetersToPixelsWidth(IntPtr handle, double length) //length是毫米,1厘米=10毫米
  12: {
  13:     System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd(handle);
  14:     IntPtr hdc = g.GetHdc();
  15:     int width = GetDeviceCaps(hdc, HORZSIZE);     // HORZRES 
  16:     int pixels = GetDeviceCaps(hdc, HORZRES);     // BITSPIXEL
  17:     g.ReleaseHdc(hdc);
  18:     return (((double)pixels / (double)width) * (double)length);
  19: }
  20:  
  21: [System.Runtime.InteropServices.DllImport("gdi32.dll")]
  22: private static extern int GetDeviceCaps(IntPtr hdc, int Index);

此種方法計算的值與實際刻度相比:10mm=實際刻度8mm

以此技術的程序:桌面刻度尺

技術文章引用:http://hi.baidu.com/kingcham/item/b3653ce0c69756216dabb8cd

在文章中所說的

GDI中有一個函數是GetDeviceCaps(),可以獲取一些關於設備的一些屬性,如HORZSIZE/HORZRES/LOGPIXELSX等。
    以上三者的關系通常滿足:HORZSIZE = 25.4 * HORZRES/LOGPIXELSX

但是在程序中卻無法滿足該條件。

 

第二種:

   1: /// <summary>
   2: /// 1英寸=25.4毫米
   3: /// </summary>
   4: const double millimererTopixel = 25.4;
   5:  
   6: public static double MillimeterToPixel(IntPtr handle, double length) //length是毫米,1厘米=10毫米
   7: {
   8:    System.Windows.Forms.Panel p = new System.Windows.Forms.Panel();
   9:    System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd(handle);
  10:  
  11:    //1英寸=25.4mm=96DPI,那么1mm=96/25.4DPI
  12:    return (((double)g.DpiX / millimererTopixel) * (double)length);
  13: }

此種方法是根據網上的換算關系得來的。得到的值與實際刻度相比:180mm=實際刻度185mm

以此技術的程序:夏克屏幕刻度尺

 

以目前而言,還無法准確的進行轉換,從而繪制標准刻度尺。如果各位有更好的方法,還望提示下,先謝謝了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM