C# 怎样让屏幕显示的图片大小与实际物理尺寸一致? 我发现,设置的图片大小是80*80 (毫米),但是实际在屏幕上测量得到的却是8.5*8.5,怎样编程能保证不同的显示器都一致呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 屏幕上的长宽是用像素和分辨率来确定的,设计的时候如果想让显示的是实际尺寸,那么就放一个一样大的控件,铺满。不同屏幕下要想显示效果一样,需要支持自动缩放。WPF ViewBox。winform程序很难实现 CSDN完了,不会有大牛了 如果没有理解错的话,你是想所有的屏幕上显示图片都是80*80mm吧。如果是这样的话,你的问题没描述清楚。在屏幕上图像的大小是以像素为单位的,所以首先得知道毫米和像素之间的转换。象素数 / DPI = 英寸数英寸数 * 25.4 = 毫米数 DPI是每英寸多少像素点因此 1毫米=DPI/25.4 个像素,80毫米=80*DPI/25.4个像素。所以你设置图片大小之前先要获得屏幕的DPI,然后算出显示80毫米需要的像素,设置图像大小。如果是WPF的话最好设置图像显示控件的SnapsToDevicePixels =true <div style="width:100%;float:right"> <img class="imgShow" src='@(!string.IsNullOrWhiteSpace(Model.thumbnail) ? Model.thumbnail : "Images/nopic.png")' width="200px" height="200px" /></div> 你换算成像素 不要冒充大头鬼DPI = 9680毫米=80*DPI/25.4个像 = 302.36220472441取整(无法设置小数像素) 为 302运行后,实测宽度为 85mm class GetPixSize { #region Win32 API [DllImport("user32.dll")] static extern IntPtr GetDC(IntPtr ptr); [DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); [DllImport("user32.dll", EntryPoint = "ReleaseDC")] static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc); #endregion #region DeviceCaps常量 const int HORZSIZE = 4; const int VERTSIZE = 6; const int LOGPIXELSX = 88; const int LOGPIXELSY = 90; const int DESKTOPVERTRES = 117; const int DESKTOPHORZRES = 118; #endregion public static double GetPixWidth(double mm) { IntPtr hdc = GetDC(IntPtr.Zero); int mmDeskWidth = GetDeviceCaps(hdc, HORZSIZE); int pxDeskWidth = GetDeviceCaps(hdc, DESKTOPHORZRES); int xDpi = GetDeviceCaps(hdc, LOGPIXELSX); double scaleX = xDpi / 96.0; double pxCountPermm = 1.0 * pxDeskWidth / mmDeskWidth; double pxCount = pxCountPermm * mm / scaleX; ReleaseDC(IntPtr.Zero, hdc); return pxCount; } public static double GetPixHeight(double mm) { IntPtr hdc = GetDC(IntPtr.Zero); int mmDeskHeight = GetDeviceCaps(hdc, VERTSIZE); int pxDeskHeight = GetDeviceCaps(hdc, DESKTOPVERTRES); int yDpi = GetDeviceCaps(hdc, LOGPIXELSY); double scaleY = yDpi / 96.0; double pxCountPermm = 1.0 * pxDeskHeight / mmDeskHeight; double pxCount = pxCountPermm * mm / scaleY; ReleaseDC(IntPtr.Zero, hdc); return pxCount; } } C#文件加解密 Richtextbox输出excel combobox问题 关于自定义表单的问题,很着急,在线忘高人指点。 treeView的checkbox问题 格式化html代码 在richTextBox中,当用户按下一个按键,我如何才能知道当前光标在第几行、第几列? 关于随机问题 关于C#问题新手,大家来看看啊 c#中如何设置socket超时? signalr 服务端使用winform或服务作宿主,怎么做权限验证呢 C#调用C++ dll 带有回调函数的结构体指针问题
在屏幕上图像的大小是以像素为单位的,所以首先得知道毫米和像素之间的转换。
象素数 / DPI = 英寸数
英寸数 * 25.4 = 毫米数
DPI是每英寸多少像素点
因此 1毫米=DPI/25.4 个像素,80毫米=80*DPI/25.4个像素。所以你设置图片大小之前先要获得屏幕的DPI,然后算出显示80毫米需要的像素,设置图像大小。如果是WPF的话最好设置图像显示控件的SnapsToDevicePixels =true
DPI = 96
80毫米=80*DPI/25.4个像 = 302.36220472441
取整(无法设置小数像素) 为 302
运行后,实测宽度为 85mm
{
#region Win32 API
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr ptr); [DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex); [DllImport("user32.dll", EntryPoint = "ReleaseDC")]
static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
#endregion
#region DeviceCaps常量
const int HORZSIZE = 4;
const int VERTSIZE = 6;
const int LOGPIXELSX = 88;
const int LOGPIXELSY = 90;
const int DESKTOPVERTRES = 117;
const int DESKTOPHORZRES = 118;
#endregion
public static double GetPixWidth(double mm)
{
IntPtr hdc = GetDC(IntPtr.Zero);
int mmDeskWidth = GetDeviceCaps(hdc, HORZSIZE);
int pxDeskWidth = GetDeviceCaps(hdc, DESKTOPHORZRES);
int xDpi = GetDeviceCaps(hdc, LOGPIXELSX);
double scaleX = xDpi / 96.0;
double pxCountPermm = 1.0 * pxDeskWidth / mmDeskWidth;
double pxCount = pxCountPermm * mm / scaleX;
ReleaseDC(IntPtr.Zero, hdc); return pxCount;
} public static double GetPixHeight(double mm)
{
IntPtr hdc = GetDC(IntPtr.Zero);
int mmDeskHeight = GetDeviceCaps(hdc, VERTSIZE);
int pxDeskHeight = GetDeviceCaps(hdc, DESKTOPVERTRES);
int yDpi = GetDeviceCaps(hdc, LOGPIXELSY);
double scaleY = yDpi / 96.0;
double pxCountPermm = 1.0 * pxDeskHeight / mmDeskHeight;
double pxCount = pxCountPermm * mm / scaleY;
ReleaseDC(IntPtr.Zero, hdc); return pxCount;
}
}