关于C#中换算像素和毫米的说明

在C#中是以像素作为尺寸单位的,像素是一种相对的尺寸概念,与毫米的转换跟当前显示器的分辨率有关,在不同分辨率下转换的系数也不同。
借助C#中的GDI可以实现像素与毫米的换算:

一、根据Win32 API定义函数获取显示器设备信息:

/// <summary>
/// 获取设备信息
/// </summary>
/// <param name="hdc">要查询设备的句柄</param>
/// <param name="index">设备信息所在的索引值</param>
/// <returns>返回对应索引值上的设备信息</returns>
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(IntPtr hdc, int index);

二、根据显示器设备信息计算像素与毫米的换算比率:

// 定义获取Graphics对象所需的控件
Panel panel = new Panel();
// 根据控件所在句柄获取Graphics对象
Graphics graphics = Graphics.FromHwnd(panel.Handle);
// 获取设备句柄
IntPtr hdc = graphics.GetHdc();
// 获取屏幕宽度(毫米)HORZSIZE
int width = GetDeviceCaps(hdc, 4);
// 获取屏幕高度(毫米)VERTSIZE
int height = GetDeviceCaps(hdc, 6);
// 获取屏幕宽度(像素)HORZRES
int xPixels = GetDeviceCaps(hdc, 8);
// 获取屏幕高度(像素)VERTRES
int yPixels = GetDeviceCaps(hdc, 10);
// 释放设备句柄
graphics.ReleaseHdc(hdc);
// 释放Graphics对象
graphics.Dispose();
// 计算X轴方向像素与毫米的比率
double xRate = (double)xPixels / (double)width;
// 计算Y轴方向像素与毫米的比率
double yRate = (double)yPixels / (double)height;

三、像素数换算为毫米数:

// 定义要换算的毫米数
double millimeter = 10;
// 计算X轴方向像素数
int xPixel = (int)Math.Round(xRate * millimeter);
// 计算Y轴方向像素数
int yPixel = (int)Math.Round(yRate * millimeter);

四、毫米数换算为像素数:

// 定义要换算的像素数
int pixel = 10;
// 计算X轴方向毫米数
double xMillimeter = pixel / xRate;
// 计算Y轴方向毫米数
double yMillimeter = pixel / yRate;

更多信息请参阅:GetDeviceCaps function (Windows)

发表评论