Konwertuj piksele na punkty

126

Muszę przekonwertować piksele na punkty w C #. Widziałem kilka skomplikowanych wyjaśnień na ten temat, ale nie mogę znaleźć prostego wzoru. Załóżmy, że standardowe 96 dpi, jak obliczyć tę konwersję?

Todd Davis
źródło

Odpowiedzi:

199

Na cal przypada 72 punkty ; jeśli wystarczy przyjąć 96 pikseli na cal, wzór jest raczej prosty:

punkty = piksele * 72/96

Istnieje sposób na pobranie skonfigurowanych pikseli na cal ekranu w systemie Windows przy użyciu GetDeviceCaps. Firma Microsoft ma przewodnik zatytułowany „Tworzenie aplikacji obsługujących rozdzielczość”. Poszukaj sekcji „Tworzenie czcionek obsługujących rozdzielczość DPI”.

W3C zdefiniował pomiar pikseli pxjako dokładnie 1/96 z 1 cala, niezależnie od rzeczywistej rozdzielczości ekranu, więc powyższy wzór powinien być dobry dla wszystkich prac internetowych.

Mark Okup
źródło
26
72 punkty za cal NIE jest przedmiotem dyskusji, jest taki sam na całej planszy!
Mitchel Sellers
11
@David dpi zależy od wyświetlacza, ppi jest stałą typograficzną
Corey Ross
3
@David ten artykuł wyjaśnia tylko, dlaczego monitory mają zmienne DPI. PPI jest nadal taki sam. Liczba kilometrów na milę nie zmienia się w zależności od samochodu, którym jeździsz. Zakładając, że 96dpi generalnie nie jest dobrym pomysłem, ale jeśli to zrobimy, to podana formuła jest poprawna.
Quentin
13
Zazwyczaj PPI to skrót oznaczający piksele na cal, a nie punkty na cal. Może właśnie stąd bierze się zamieszanie? Punkty na cal wynoszą zawsze 72; dzięki za link Xetius.
Mark Ransom
@Corey Ross: Właściwie DPI będzie zależne od drukarki, podczas gdy PPI będzie zależne od monitora. Ale wszyscy błędnie nazywają PPI DPI ...
Stefan Steiger
58

Spróbuj tego, jeśli twój kod ma postać:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Hejazi
źródło
2
Czy warto zauważyć, że DpiX jest dla szerokości, gdzie DpiY powinno być używane dla wysokości?
PandaWood
25

Zakładając, że 96dpi to ogromny błąd. Nawet jeśli założenie jest słuszne, istnieje również opcja skalowania czcionek. Zatem czcionka ustawiona na 10 punktów może w rzeczywistości być wyświetlana tak, jakby wynosiła 12,5 punktu (125%).

Joel Coehoorn
źródło
23

Zaczynając od podanych:

  • W calu są 72 punkty (to jest punkt, 1/72 cala)
  • w systemie ustawionym na 150 dpi jest 150 pikseli na cal.
  • 1 cal = 72 pkt = 150 pikseli (dla ustawienia 150 dpi)

Jeśli chcesz znaleźć punkty (pt) na podstawie pikseli (px):

 72 pt    x pt
------ = -----                  (1) for 150dpi system
150 px    y px

Zmiana układu:

x = (y/150) * 72                (2) for 150dpi system

więc:

points = (pixels / 150) * 72    (3) for 150dpi system
Ian Boyd
źródło
1
dpi w pierwszym równaniu powinno być px - do anulowania terminów, ponieważ mamy założenie (1) dla systemu 150dpi
Jason S
9

WPF konwertuje punkty na piksele za pomocą System.Windows.FontSizeConverter. FontSizeConverter używa System.Windows.LengthConverter. LengthConverter wykorzystuje współczynnik 1.333333333333333333 do konwersji punktów (p) na piksele (x): x = p * 1.3333333333333333

Heind
źródło
Proszę również wyjaśnić, dlaczego ta wartość jest używana ... Przypadkowo jest to 96 dpi (domyślne DPI okien dla wyświetlaczy) / 72 dpi (DPI, w których definiowane są punkty).
WYJŚCIE - Anony-Mousse
5

System.Drawing.Graphics ma właściwości DpiX i DpiY. DpiX to piksele na cal w poziomie. DpiY to piksele na cal w pionie. Użyj ich do konwersji punktów (72 punkty na cal) na piksele.

Np .: 14 punktów poziomych = (14 * DpiX) / 72 piksele

spotcatbug
źródło
4

Z pewnością całe to pytanie powinno brzmieć:

„Jak uzyskać poziomy i pionowy PPI (piksele na cal) monitora?”

W calu znajdują się 72 punkty (z definicji „punkt” jest definiowany jako 1/72 cala, podobnie jak „pica” jest definiowany jako 1/72 stopy). Dzięki tym dwóm bitom informacji możesz bardzo łatwo przekonwertować z px na pt iz powrotem.

JeeBee
źródło
Żeby było jeszcze bardziej skomplikować, zajmuję się wyrównywaniem rzeczy w raporcie usług Reporting Services (RDL), który jest konwertowany na plik PDF. Pod koniec dnia, kto do cholery wie, co to jest DPI? Podaję moje najlepsze przypuszczenie. :)
Todd Davis
Masz na myśli „Jak uzyskać poziome i pionowe DPI monitora?”. PPI to stała 72. Zawsze była i zawsze będzie.
Xetius,
1
Piksele na cal, a nie liczba punktów na cal (Pica).
JeeBee
1
Ups, nie Pica! To 1/6 cala. Punkty na cal jest zbędne, termin to „Punkty”. „Punkt” to 1/72 cala.
JeeBee,
4

Właściwie to musi być

points = pixels * 96 / 72
david
źródło
1
Jest to niepoprawne, jeśli zakładasz 96 dpi i 72 ppi (punkty na cal). Będą to punkty = piksele * 72/96
Jason S
4

punkty = (piksele / 96) * 72 na standardowym komputerze XP / Vista / 7 (ustawienia fabryczne)

punkty = (piksele / 72) * 72 na standardowym komputerze Mac z systemem OSX (ustawienia fabryczne)

Windows działa domyślnie z rozdzielczością 96 dpi (wyświetlacz) Komputery Mac domyślnie działają z rozdzielczością 72 dpi (wyświetlacz)

72 punkty POSTSCRIPT = 1 cal 12 punktów POSTSCRIPT = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 punkty = 1 cal

1 punkt = 1⁄72 cala = 25,4⁄72 mm = 0,3527 mm

DPI = Kropki na cal PPI = Piksele na cal LPI = Linie na cal

Więcej informacji, jeśli używasz em jako pomiaru

16px = 1em (domyślnie dla zwykłego tekstu) 8em = 16px * 8 pikseli / 16 = em

Bubba Tbone
źródło
1

To działa:

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
Michael Zhang
źródło
0

Używanie wxPython na Macu, aby uzyskać prawidłowe DPI w następujący sposób:

    from wx import ScreenDC
    from wx import Size

    size: Size = ScreenDC().GetPPI()
    print(f'x-DPI: {size.GetWidth()} y-DPI: {size.GetHeight()}')

To daje:

x-DPI: 72 y-DPI: 72

Zatem wzór jest następujący:

points: int = (pixelNumber * 72) // 72

hasii
źródło
-1

Linie wysokości zamienione na punkty i piksele (moja własna formuła). Oto przykład z ręcznym wprowadzeniem 213,67 punktów w polu Wysokość wiersza:

213.67  Manual Entry    
  0.45  Add 0.45    
214.12  Subtotal    
213.75  Round to a multiple of 0.75 
213.00  Subtract 0.75 provides manual entry converted by Excel  
284.00  Divide by 0.75 gives the number of pixels of height

Tutaj ręczne wprowadzenie 213,67 punktów daje 284 piksele.
Tutaj ręczne wprowadzenie 213,68 punktów daje 285 pikseli.

(Dlaczego 0,45? Nie wiem, ale działa.)

daniel
źródło