Konversikan Piksel ke Poin

125

Saya perlu mengonversi Piksel ke Poin di C #. Saya telah melihat beberapa penjelasan rumit tentang topik tersebut, tetapi sepertinya tidak dapat menemukan formula sederhana. Mari kita asumsikan 96dpi standar, bagaimana cara menghitung konversi ini?

Todd Davis
sumber

Jawaban:

198

Ada 72 poin per inci ; jika cukup untuk mengasumsikan 96 piksel per inci, rumusnya agak sederhana:

poin = piksel * 72/96

Ada cara untuk mendapatkan piksel yang dikonfigurasi per inci dari tampilan Anda di Windows menggunakan GetDeviceCaps. Microsoft memiliki panduan yang disebut "Mengembangkan Aplikasi DPI-Sadar" , lihat bagian "Membuat DPI-Sadar Font".

W3C telah mendefinisikan pengukuran piksel pxsebagai tepat 1/96 dari 1in terlepas dari resolusi aktual layar Anda, sehingga rumus di atas harus baik untuk semua pekerjaan web.

Mark tebusan
sumber
26
72 Poin Per inci BUKAN item yang bisa diperdebatkan, itu sama di seluruh papan!
Penjual Mitchel
11
@ David dpi tergantung pada tampilan, ppi adalah konstanta tipografi
Corey Ross
3
@Buat artikel itu hanya menjelaskan mengapa monitor memiliki variabel DPI. PPI masih sama. Jumlah kilometer dalam satu mil tidak berubah tergantung pada mobil yang Anda kendarai. Dengan asumsi 96dpi umumnya bukan ide yang baik, tetapi jika kita melakukannya maka formula yang diberikan adalah benar.
Quentin
13
Biasanya PPI adalah singkatan untuk piksel per inci, bukan poin per inci. Mungkin dari sanalah kebingungan itu berasal? Poin per inci selalu 72; terima kasih atas tautan Xetius.
Mark Ransom
@Corey Ross: Sebenarnya, DPI akan tergantung pada printer, sementara PPI tergantung pada monitor. Tapi semua orang salah memanggil PPI DPI ...
Stefan Steiger
58

Coba ini jika kode Anda terletak pada formulir:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Hejazi
sumber
2
Apakah pantas menunjukkan bahwa DpiX adalah untuk Lebar di mana DpiY harus digunakan untuk ketinggian?
PandaWood
25

Dengan asumsi 96dpi adalah kesalahan besar . Sekalipun asumsi itu benar, ada juga opsi untuk menskala font. Jadi font yang ditetapkan untuk 10pts sebenarnya dapat ditampilkan seolah-olah 12.5pt (125%).

Joel Coehoorn
sumber
23

Dimulai dengan yang diberikan:

  • Ada 72 poin dalam satu inci (itulah intinya, 1/72 inci)
  • pada sistem yang diatur untuk 150dpi, ada 150 piksel per inci.
  • 1 in = 72pt = 150px (untuk pengaturan 150dpi)

Jika Anda ingin menemukan poin (pt) berdasarkan piksel (px):

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

Mengatur ulang:

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

begitu:

points = (pixels / 150) * 72    (3) for 150dpi system
Ian Boyd
sumber
1
dpi dalam persamaan pertama harus px - untuk membatalkan istilah, karena kami memiliki asumsi (1) untuk sistem 150dpi
Jason S
9

WPF mengonversi titik ke piksel dengan System.Windows.FontSizeConverter. FontSizeConverter menggunakan System.Windows.LengthConverter. LengthConverter menggunakan faktor 1.333333333333333333 untuk mengkonversi dari titik (p) ke piksel (x): x = p * 1.3333333333333333

Heind
sumber
Tolong jelaskan juga mengapa nilai ini digunakan ... Secara kebetulan, ini adalah 96 dpi (DPI default windows untuk tampilan) / 72 dpi (DPI yang titiknya didefinisikan pada).
Memiliki QUIT - Anony-Mousse
5

System.Drawing.Graphics memiliki properti DpiX dan DpiY. DpiX adalah piksel per inci secara horizontal. DpiY adalah piksel per inci secara vertikal. Gunakan itu untuk mengkonversi dari titik (72 poin per inci) ke piksel.

Mis: 14 titik horizontal = (14 * DpiX) / 72 piksel

spotcatbug
sumber
4

Tentunya seluruh pertanyaan ini seharusnya:

"Bagaimana cara mendapatkan PPI horizontal dan vertikal (Piksel Per Inci) dari monitor?"

Ada 72 titik dalam satu inci (menurut definisi, "titik" didefinisikan sebagai 1/72 inci, demikian pula "pica" didefinisikan sebagai 1/72 kaki). Dengan dua bit informasi ini Anda dapat mengkonversi dari px ke pt dan kembali dengan sangat mudah.

Astaga
sumber
Untuk membuatnya lebih rumit, saya sedang berurusan dengan menyelaraskan hal-hal pada laporan Layanan Pelaporan (RDL) yang sedang dikonversi menjadi PDF. Pada akhirnya, siapa yang tahu apa DPI itu? Saya menggunakan tebakan terbaik saya. :)
Todd Davis
Maksud Anda, "Bagaimana cara mendapatkan DPI monitor horizontal dan vertikal?" PPI adalah konstanta dari 72. Selalu dan akan selalu.
Xetius
1
Piksel Per Inci, bukan Poin Per Inci (Pica).
JeeBee
1
Um, oops, bukan Pica! Itu 1/6 inci. Poin Per Inch adalah mubazir, istilahnya adalah "Poin". "Point" adalah 1/72 inci.
JeeBee
4

Sebenarnya harus begitu

points = pixels * 96 / 72
David
sumber
1
Ini salah jika Anda menganggap 96dpi, dan 72ppi (poin per inci). Ini akan menjadi poin = piksel * 72/96
Jason S
4

poin = (piksel / 96) * 72 pada mesin XP / Vista / 7 standar (default pabrik)

poin = (piksel / 72) * 72 pada Mac standar yang menjalankan OSX (Default pabrik)

Windows berjalan sebagai default di 96dpi (display) Mac berjalan sebagai default di 72 dpi (display)

72 Poin POSTSCRIPT = 1 inci 12 Poin POSTSCRIPT = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 Poin = 1 inci

1 poin = 1⁄72 inci = 25,4⁄72 mm = 0,3527 mm

DPI = Dots Per Inch PPI = Pixels Per Inch LPI = Lines per inch

Info lebih lanjut jika menggunakan mereka sebagai pengukur

16px = 1em (default untuk teks normal) 8em = 16px * 8 Pixels / 16 = em

Bubba Tbone
sumber
1

Ini bekerja:

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
Michael Zhang
sumber
0

Menggunakan wxPython di Mac untuk mendapatkan DPI yang benar sebagai berikut:

    from wx import ScreenDC
    from wx import Size

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

Ini menghasilkan:

x-DPI: 72 y-DPI: 72

Jadi, rumusnya adalah:

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

hasii
sumber
-1

Garis tinggi dikonversi menjadi titik dan piksel (rumus saya sendiri). Berikut ini adalah contoh dengan entri manual 213,67 poin di bidang Tinggi Baris:

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

Di sini entri manual 213,67 poin memberikan 284 piksel.
Di sini entri manual 213,68 poin memberikan 285 piksel.

(Mengapa 0,45? Saya tidak tahu tetapi itu berhasil.)

daniel
sumber