2012-04-19 51 views
3

转换像素CM在WPF

?(New System.Windows.LengthConverter()).ConvertFrom("1cm") 
37.795275590551178 {Double} 
    Double: 37.795275590551178 

所以,在1cm37.795275590551178px WPF像素。

我的问题是我如何从px转换回cm

+0

回答人,之前downvote;) – serhio 2012-04-19 15:39:48

回答

15

如WPF我们处理DeviceIndependentUnits(DIU,命名,传统的“PX”),该单位不依赖于设备的屏幕分辨率。

实际上在.NET框架(4)中使用的因素, '在' '像素', '厘米' 和 'PT' 分别

// System.Windows.LengthConverter 
private static double[] PixelUnitFactors = new double[] 
{ 
    1.0, 
    96.0, 
    37.795275590551178, 
    1.3333333333333333 
}; 

因此,我们有

private struct PixelUnitFactor 
{ 
    public const double Px = 1.0; 
    public const double Inch = 96.0; 
    public const double Cm = 37.7952755905512; 
    public const double Pt = 1.33333333333333; 
}  

public double CmToPx(double cm) 
{ 
    return cm * PixelUnitFactor.Cm; 
} 

public double PxToCm(double px) 
{ 
    return px/PixelUnitFactor.Cm; 
} 
+0

这对我来说没有意义。你在120DPI(由Win32 API GetDeviceCaps()返回)的屏幕上告诉我,WPF中的英寸仍然是96 DPI? WPF如何解释这种差异?像素的宽度是否增加了20%? – Andy 2017-02-03 02:06:29

+1

是的。在一个96 dpi的屏幕上,WPF中的1个像素是一种定义。当你的屏幕有更高的分辨率时,尺寸会增加。 – pinki 2017-02-11 14:41:56

+0

这个公式不完整。你需要考虑物理屏幕尺寸 – 2017-05-03 07:13:00

2

这是计算机行业使用英寸的问题。每英寸有96个像素。每英寸有2.54厘米。 37.795275590551178(1厘米)* 2.54 = 95.9999999999997像素(我们将其称为96)。

你总是可以创建一个应用程序级常数37.795275590551178,或者你可以使用英寸,来回转换英寸和厘米......

用于转换PX至厘米,你可以转换到PX英寸到厘米,或者你可以使用上面的常数并除以得到厘米。

96像素/37.795275590551178=2.54cm。

这里是另一个SO张贴关于它: Centimeter to pixel

+0

所以,框架不提供转换它的方式,我需要手动执行它? – serhio 2012-04-19 16:22:49

+0

我很确定有一些程序集提供了这样的方法,但除非你使用它们,否则我认为你必须自己去做。无论如何, – CodeWarrior 2012-04-19 16:25:22

+0

,这一切都取决于屏幕分辨率......所以我迷路了...... – serhio 2012-04-19 16:35:11

1

我有类似的麻烦,但德WPF使计算调整逻辑像素为物理像素。也许这段代码可以帮助你。

public struct PixelUnitFactor 
{ 
    public const double Px = 1.0; 
    public const double Inch = 96.0; 
    public const double Cm = 37.795275590551178; 
    public const double Pt = 1.33333333333333; 
} 

public struct CmUnitFactor 
{ 
    public const double Px = 0.0264583333333333; 
    public const double Inch = 2.54; 
    public const double Cm = 1.0; 
    public const double Pt = 0.035277778; 
} 

public struct InUnitFactor 
{ 
    public const double Px = 0.0104166666666667; 
    public const double Inch = 1.0; 
    public const double Cm = 0.3937007874015748; 
    public const double Pt = 0.013888888888889; 
} 

public struct PtUnitFactor 
{ 
    public const double Px = 0.75; 
    public const double Inch = 72.0; 
    public const double Cm = 28.346456693; 
    public const double Pt = 1.0; 
} 

public class FormsEvent 
{ 

    //FUNCIONES PARA CONVERTIR PIXELS EN CENTÍMETROS, PULGADAS Y PUNTOS 
    public static double Convertir_PxToCm(double px) { return px/PixelUnitFactor.Cm; } 
    public static double Convertir_PxToIn(double px) { return px/PixelUnitFactor.Inch; } 
    public static double Convertir_PxToPt(double px) { return px/PixelUnitFactor.Pt; } 

    //FUNCIONES PARA CONVERTIR CENTÍMETROS EN PIXELS, PULGADAS Y PUNTOS 
    public static double Convertir_CmToPx(double cm) { return cm/CmUnitFactor.Px; } 
    public static double Convertir_CmToIn(double cm) { return cm/CmUnitFactor.Inch; } 
    public static double Convertir_CmToPt(double cm) { return cm/CmUnitFactor.Pt; } 

    //FUNCIONES PARA CONVERTIR PULGADAS EN PIXELS, CENTÍMETROS Y PUNTOS 
    public static double Convertir_InToPx(double inches) { return inches/InUnitFactor.Px; } 
    public static double Convertir_InToCm(double inches) { return inches/InUnitFactor.Cm; } 
    public static double Convertir_InToPt(double inches) { return inches/InUnitFactor.Pt; } 

    //FUNCIONES PARA CONVERTIR PUNTOS EN PIXELS, PULGADAS Y CENTÍMETROS 
    public static double Convertir_PtToPx(double pt) { return pt/PtUnitFactor.Px; } 
    public static double Convertir_PtToCm(double pt) { return pt/PtUnitFactor.Cm; } 
    public static double Convertir_PtToIn(double pt) { return pt/PtUnitFactor.Inch; }