2012-05-31 11 views
6

Bir bitmap üzerinde metin çizmek için aşağıdaki kodu kullanıyorum:GDI +? Kullanarak metin çizerken kesin bir yazı tipi boyutu tanımlamak mümkün mü?

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

Güzel çalışır. İşte oluşturulur metin: Ben metin biraz daha büyük yapmak istiyorum

enter image description here

. Ben yazı tipi boyutu gibi 11 ayarlarsanız, burada i elde ediyoruz: Bu ne istiyorum için çok büyük

enter image description here

. I 10.25, 10.5 ve çalıştı ama aynı zamanda Pixel için GraphicsUnit ayarlamak deneyin 10

aynı sonucu verir ama aynı (özel yazı tipi boyutunu ayarlamak için bir olasılığı) davranır. GDI + (C#) kullanarak metin çizerken

, bir possiblity hale metnin "ince ayar" boyutu vardır: İşte

sorum şu?


DÜZENLEME: daha tam kod parçacığı (istendiği gibi):

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

deneyin 'TextRenderingHint.ClearTypeGridFit' – leppie

+0

Ben graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit çalıştı, ama aynı sonuçlar – tigrou

+1

Ben senin' StringFormat' yanlış şüpheli verir. IIRC, ben FitBlackBox'u başarı ile kullandım. Aslında, çok özel yükseklik ayarlarına dayanarak yazı tipi genişliğini tam olarak bir tam sayı olacak şekilde değiştirdim. – leppie

cevap

3

C# veya .NET kütüphanelerini bilmiyorum ama, this page bakarak, TextRenderingHint için AntiAlias seçerek ipucu kapatın ve antialiasing açmak gerektiğini görünüyor. Bu, size daha fazla boyutlar, ancak muhtemelen daha fuzzier metin verecektir.

Sorun, yazı tipi ipucu. Bir fontun ayrıntıları, bir serifin strok genişliği veya boyutu gibi, hedef cihazın çözünürlüğü ile aynı sırada olduğunda, tasarım ünitelerini cihaz ünitelerine basitçe ölçeklendirmek, özellikle herhangi bir antialiasing olmadığında, düzensiz, düzensiz metinlere neden olabilir. tür.

Bunu önlemek için, çoğu yazı çözünürlüğü sınırlı olduğunda yuvarlama için özel durum kurallarını vermek "ipuçları" var. Etki, boyuttaki "adımları" görmenizdir.

Adımlardan kaçınmak istiyorsanız, "ipucu" özelliğini kapatmanız gerekir. Bu, rasterleştiricinin özel yuvarlama kurallarını göz ardı etmesine ve tasarım birimlerini doğrudan aygıt birimlerine ölçeklendirmesine neden olur. Bu, gerçekten doğrusal olarak ölçeklendirilmiş metne sahip olmanızı sağlar. Ticaret-off, metnin küçük boyutlarda iyi görünmeyebileceğidir. Antialiasing, simetriyi geliştirebilir, ancak birçok insana, metin bulanık görünebilir.

4

Graphics.DrawString() o yazıcılar gibi yüksek çözünürlüklü cihazlar için uygundur, şiddetli ve çözümsüz doğruluk sorunları vardır.

Bunun yerine .NET 2.0 TextRenderer.DrawText() yöntemini kullanın.

+0

Söylemek istediğim bir şey: kod, ASP.NET 3.5 uygulamasında bir .ashx hizmetinde kullanılır. Sistem'i kullanmak güvenlidir.Windows.Forms derleme (varsayılan olarak dahil değil)? – tigrou

+0

Evet, sorun değil. –

+1

TextRenderer.DrawText() yöntemini denedim. 9.7 yazı tipi boyutu sorgumda ilk resim gibi görünürken, 9.8 ikincisi gibi görünüyor. Yani temelde işe yaramıyor. Belirlemek için bazı bayraklar/seçenekler var mı? GraphicsUnit'i Pixel ve leppie önerisine ayarlamayı denedim, ancak şans değil. – tigrou

İlgili konular