2012-04-19 97 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; }