2012-05-31 29 views
6

Używam następujący kod do rysowania tekstu na bitmapę:Czy możliwe jest określenie dokładnego rozmiaru czcionki podczas rysowania tekstu za pomocą GDI +?

using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) 
{ 
    //draw the text 
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); 
} 

Działa miłe. Tutaj jest renderowany tekst:

enter image description here

Chcę, by tekst był trochę większy. Jeżeli ustawić 11 jak rozmiar czcionki, o to co ja dostać:

enter image description here

Jest zbyt duży dla czego chcę. Próbowałem 10,25, 10,5 i takie, ale to daje taki sam wynik jak 10.

Ja też spróbować ustawić GraphicsUnit do Pixel ale zachowuje taką samą (nie ma możliwości, aby ustawić niestandardowy rozmiar czcionki).

Oto moje pytanie:

Podczas opracowywania tekstu przy użyciu GDI + (C#), czy istnieje możliwośc „dostroić” wielkość świadczonych tekstu?


Edycja: kod bardziej kompletny fragment (na żądanie)

using (Bitmap bitmap = new Bitmap(width, height)) 
using (Graphics graphics = Graphics.FromImage(bitmap))  
using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) 
{ 
    graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

    Rectangle rect = new Rectangle(0, 0, width, height); 

    //method 1 
    StringFormat stringFormat = new StringFormat(); 
    stringFormat.Alignment = StringAlignment.Center; 
    stringFormat.LineAlignment = StringAlignment.Center; 
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); 

    //method 2 
    TextFormatFlags flags = TextFormatFlags.HorizontalCenter | 
     TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;  
    TextRenderer.DrawText(graphics, "Some text", font, rect, Color.White, flags); 

    bitmap.Save(stream, ImageFormat.Png);   
} 
+0

Spróbuj 'TextRenderingHint.ClearTypeGridFit' – leppie

+0

Próbowałem graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit, ale daje takie same wyniki – tigrou

+1

Podejrzewam swój' StringFormat' jest źle. IIRC, użyłem 'FitBlackBox' z sukcesem. W rzeczywistości zmieniłem szerokość czcionki, aby była dokładnie liczbą całkowitą, w oparciu o bardzo szczegółowe ustawienia wysokości. – leppie

Odpowiedz

3

nie wiem, C# lub bibliotek .NET, ale, patrząc na this page, wydaje się, że wybierając AntiAlias dla TextRenderingHint należy wyłączyć i włączyć podpowiedzi antyaliasingu. Zapewni to więcej pośrednich rozmiarów, ale prawdopodobnie bardziej nieostrożny tekst.

Kwestią jest podpowiedź do czcionki. Gdy szczegóły czcionki, takie jak szerokość obrysu lub wielkość szeryfów, są w tej samej kolejności, co rozdzielczość urządzenia docelowego, po prostu skalowanie jednostek projektu do jednostek urządzeń może spowodować nierówny, nierówny tekst, zwłaszcza gdy nie ma żadnych wygładzeń żadnych uprzejmy.

Aby tego uniknąć, większość czcionek zawiera "podpowiedzi", które zawierają specjalne zasady dotyczące zaokrąglania, gdy rozdzielczość jest ograniczona. Efekt jest taki, że widzisz "kroki" w rozmiarze.

Jeśli chcesz uniknąć kroków, musisz wyłączyć "podpowiedzi". Spowoduje to, że rasteryzer zignoruje specjalne reguły zaokrąglania i po prostu skaluje jednostki projektowe bezpośrednio do jednostek urządzeń. Dzięki temu możesz mieć naprawdę liniowy tekst skalujący. Kompromis polega na tym, że tekst może nie wyglądać tak dobrze w małych rozmiarach. Antyaliasing może poprawić symetrię, ale dla wielu osób tekst może być niewyraźny.

4

Graphics.DrawString() ma silne i nierozwiązane problemy dotyczące dokładności, to nadaje się tylko do urządzeń wysokiej rozdzielczości, takich jak drukarki.

Zamiast tego należy użyć metody .NET 2.0 TextRenderer.DrawText().

+0

Jedna rzecz, o której zapomniałem wspomnieć: kod jest używany w usłudze .ashx, w aplikacji ASP.NET 3.5. czy korzystanie z Systemu jest bezpieczne?Zestaw Windows.Forms (nie jest domyślnie dołączony)? – tigrou

+0

Tak, nie ma problemu. –

+1

Próbowałem metody TextRenderer.DrawText(). rozmiar czcionki 9.7 renderuje się jak pierwsze zdjęcie z mojego pytania, a 9.8 - jak drugi. Więc w zasadzie to nie działa. Czy są jakieś flagi/opcje do ustawienia? Próbowałem ustawić GraphicsUnit na Pixel i leppie sugestię, ale nie szczęście. – tigrou

Powiązane problemy