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?
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:
İ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 px
olarak 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.
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.
Verilenle başlayarak:
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
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
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
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.
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
Bu çalışıyor:
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
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
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.)