2016-01-21 14 views
7

Próbuję oszacować szerokości w pikselach, jeśli tekst będzie renderowany w Chrome, używając C# dla określonej czcionki (Arial 18px) w narzędziu, które utworzę .C#: Szerokość pasującego piksela tekstu renderowanego w przeglądarce

Porównując moje wyniki z tego narzędzia (korzysta z przeglądarki do renderowania szerokość): http://searchwilderness.com/tools/pixel-length/ ciąg:

"Lorem ipsum dolor sit amet, consectetur adipiscing elit." 

oblicza się na 439 pikseli szerokości.

Ale z tego kodu w C# uzyskać 445px:

var font = new Font("Arial", 18, FontStyle.Regular, GraphicsUnit.Pixel); 
var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; 
var size = TextRenderer.MeasureText(text, font, new Size(int.MaxValue, int.MaxValue), TextFormatFlags.NoPadding); 

mogę zmodyfikować mój kod tak czyni podobny do przeglądarki?

Próbowałem wydrukować etykietę z czcionką i tekstem oraz porównać z renderowaniem przeglądarki, które pasują (+/- 1px).

+5

Być może powinieneś mieć więcej szczęścia porównując dwóch różnych dostawców na niższym poziomie. Porównujesz przeglądarkę z językiem programowania, gdy w rzeczywistości ta przeglądarka używa Webkita, który może definiować własny niestandardowy interfejs API do rysowania, podczas gdy interfejs API, którego używasz w języku C#, może używać GDI +, DirectX itd. –

+1

Możesz porównać Graphics.MesaureString () z opcją StringFormat.GenericTypographic. Ale tak naprawdę: 439 vs 445 jest całkiem blisko imo. – TaW

+0

Który z nich jest poprawny, w IE w searchwilderness daje 438 na chrome 435? – Anil

Odpowiedz

3

Można użyć GDI + z StringFormat.GenericTypographic Zamiast:

var font = new System.Drawing.Font("Arial", 18, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); 
var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; 
var graphics = System.Drawing.Graphics.FromHwnd(IntPtr.Zero); 
var size = graphics.MeasureString(text, font, int.MaxValue, System.Drawing.StringFormat.GenericTypographic); 

Patrz także: https://stackoverflow.com/a/6404811

+0

Pracował jak urok! –

0

Najbardziej niezawodnym sposobem jest zbudowanie bazy klientów-renderowane szerokości znaków. Nie jest to trywialne, mierzy wszystkie znaki dla każdej unikatowej czcionki, wariancji (pogrubienie/kursywa), rozmiaru, współczynników skalowania, przeglądarki i platformy.

Aby tego uniknąć, lepiej jest wykonać logikę renderowania u klienta, gdzie wartości rzeczywiste można znaleźć za pomocą odpowiednika funkcji getTextWidth().

Powiązane problemy