Pikselleri Noktalara Dönüştür


126

C # 'ta Pikselleri Noktalara dönüştürmem gerekiyor. Konuyla ilgili bazı karmaşık açıklamalar gördüm, ancak basit bir formül bulamıyorum. Standart bir 96dpi varsayalım, bu dönüşümü nasıl hesaplayabilirim?

Yanıtlar:


199

İnç başına 72 nokta vardır ; inç başına 96 piksel varsaymak yeterliyse, formül oldukça basittir:

nokta = piksel * 72/96

Windows'ta ekranınızın inç başına yapılandırılmış piksellerini kullanarak almanın bir yolu vardır GetDeviceCaps. Microsoft'un "DPI Duyarlı Uygulamalar Geliştirme" adlı bir kılavuzu vardır , "DPI-Duyarlı Yazı Tipleri Oluşturma" bölümüne bakın.

W3C, piksel ölçümünü , ekranınızın gerçek çözünürlüğünden bağımsız pxolarak tam olarak 1 / 96'da 1 olarak tanımlamıştır , bu nedenle yukarıdaki formül tüm web çalışmaları için iyi olmalıdır.


26
İnç başına 72 Puan tartışmalı bir öğe DEĞİLDİR, her yerde aynıdır!
Mitchel Sellers

11
@David dpi ekrana bağlıdır, ppi tipografik sabittir
Corey Ross

3
@David bu makale sadece monitörlerin neden değişken DPI'ya sahip olduğunu açıklıyor. ÜFE hala aynı. Bir mildeki kilometre sayısı, kullandığınız araca göre değişmez. 96 dpi varsaymak genellikle iyi bir fikir değildir, ancak bunu yaparsak verilen formül doğrudur.
Quentin

13
Genellikle PPI, inç başına piksel sayısı değil, inç başına piksel kısaltmasıdır. Belki de karışıklığın kaynağı budur? İnç başına nokta her zaman 72'dir; Xetius bağlantısı için teşekkürler.
Mark Ransom

@Corey Ross: Aslında, DPI yazıcıya bağlıyken, ÜFE monitörün başucunda olacaktır. Ama herkes yanlışlıkla ÜFE DPI'yı çağırıyor ...
Stefan Steiger 4'15

58

Kodunuz bir biçimde bulunuyorsa bunu deneyin:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();

2
DpiX'in DpiY'nin yükseklik için kullanılması gereken Genişlik için olduğuna işaret etmeye değer mi?
PandaWood

25

96 dpi varsaymak büyük bir hata. Varsayım doğru olsa bile, yazı tiplerini ölçeklendirme seçeneği de vardır. Dolayısıyla, 10 puntoluk bir yazı tipi seti aslında 12,5 punto (% 125) gibi gösterilebilir.


23

Verilenle başlayarak:

  • Bir inçte 72 nokta vardır (bu nokta nedir, 1/72 inç)
  • 150dpi için ayarlanmış bir sistemde, inç başına 150 piksel vardır.
  • 1 in = 72pt = 150px (150dpi ayarı için)

Piksellere (px) göre noktalar (pt) bulmak istiyorsanız:

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

yeniden düzenleme:

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

yani:

points = (pixels / 150) * 72    (3) for 150dpi system

1
İlk denklemdeki dpi piksel olmalıdır - terimleri iptal etmek için, 150dpi sistem için (1) varsayımımız olduğundan
Jason S

9

WPF, System.Windows.FontSizeConverter ile noktaları piksellere dönüştürür. FontSizeConverter, System.Windows.LengthConverter'ı kullanır. LengthConverter, noktadan (p) piksele (x) dönüştürmek için 1.333333333333333333 faktörünü kullanır: x = p * 1.3333333333333333


Lütfen bu değerin neden kullanıldığını da açıklayın ... Tesadüfen, 96 dpi (ekranlar için varsayılan pencere DPI) / 72 dpi (noktaların tanımlandığı DPI).
ÇIKTI - Anony-Mousse

5

System.Drawing.Graphics, DpiX ve DpiY özelliklerine sahiptir. DpiX, yatay olarak inç başına pikseldir. DpiY, dikey olarak inç başına pikseldir. Bunları noktalardan (inç başına 72 nokta) piksele dönüştürmek için kullanın.

Ör: 14 yatay nokta = (14 * DpiX) / 72 piksel


4

Elbette bu sorunun tamamı şöyle olmalıdır:

"Monitörün yatay ve dikey PPI'sını (İnç Başına Piksel) nasıl elde ederim?"

Bir inçte 72 nokta vardır (tanım gereği bir "nokta", bir inçin 1 / 72'si olarak tanımlanır, benzer şekilde bir "pika", bir ayağın 1 / 72'si olarak tanımlanır). Bu iki bitlik bilgi ile px'den pt'ye ve çok kolay bir şekilde geri dönüştürebilirsiniz.


Daha da karmaşık hale getirmek için, PDF'ye dönüştürülen bir Raporlama Servisleri (RDL) raporundaki şeyleri hizalamakla uğraşıyorum. Günün sonunda DPI'nın ne olduğunu kim bilebilir ki? En iyi tahminimi kullanıyorum. :)
Todd Davis

"Monitörün yatay ve dikey DPI'ını nasıl elde ederim?" Demek istiyorsunuz. ÜFE sabit 72'dir. Her zaman olmuştur ve her zaman olacaktır.
Xetius

1
İnç Başına Piksel, İnç Başına Nokta (Pika) değil.
JeeBee

1
Oops, Pica değil! Bu bir inçin 1 / 6'sı. İnç Başına Puan gereksizdir, terim "Puan" tır. Bir "Nokta", İnç'in 1 / 72'si kadardır.
JeeBee

4

Aslında olmalı

points = pixels * 96 / 72

1
96dpi ve 72ppi (inç başına nokta) olduğunu varsayıyorsanız, bu yanlıştır. Nokta = piksel *
Jason S

4

nokta = (piksel / 96) * 72 standart bir XP / Vista / 7 makinesinde (fabrika varsayılanları)

nokta = (piksel / 72) * 72, OSX çalıştıran standart bir Mac'te (Fabrika varsayılanları)

Windows varsayılan olarak 96 dpi (ekran) olarak çalışır Mac'ler varsayılan olarak 72 dpi (ekran) olarak çalışır

72 POSTSCRIPT Puanı = 1 inç 12 POSTSCRIPT Noktası = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 Nokta = 1 inç

1 nokta = 1⁄72 inç = 25,4⁄72 mm = 0,3527 mm

DPI = İnç Başına Nokta Sayısı PPI = İnç Başına Piksel LPI = İnç Başına Satır

Ölçmek için em kullanıyorsanız daha fazla bilgi

16px = 1em (normal metin için varsayılan) 8em = 16px * 8 Piksel / 16 = em


1

Bu çalışıyor:

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

0

Doğru DPI değerini elde etmek için Mac'te wxPython kullanma aşağıdaki gibi:

    from wx import ScreenDC
    from wx import Size

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

Bu, şunları verir:

x-DPI: 72 y-DPI: 72

Dolayısıyla formül şudur:

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


-1

Yükseklik çizgileri nokta ve piksele dönüştürüldü (benim kendi formülüm). Satır Yüksekliği alanına manuel olarak 213,67 nokta girişi olan bir örnek:

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

Burada 213.67 noktanın manuel girişi 284 piksel verir.
Burada 213.68 noktanın manuel girişi 285 piksel verir.

(Neden 0.45? Bilmiyorum ama işe yarıyor.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.