2009-06-17 9 views
2

Ich habe versucht, dies zu tun, aber aus irgendeinem Grund, dies gibt mir nur komisch Ergebnisse:(C#) Wie ein Unentschieden „a“ mit Tahoma mit height = 6

int bpp = Screen.PrimaryScreen.BitsPerPixel; 
string fontName = "Tahoma"; 
Font font = new Font(fontName, 10 * bpp, GraphicsUnit.Point); 
Bitmap bm = new Bitmap(20 * bpp, 20 * bpp); 
Graphics g = Graphics.FromImage(bm); 
TextRenderer.DrawText(g, "a", font, new Rectangle(0, 0, 5 * bpp, 6 * bpp), Color.Black); 
g.Flush(); 
pictureBox1.Image = bm; 

Was ich bin hier falsch machen? Ich sehe nichts auf dem Bild gedruckt. Wenn ich alle bpp-Referenzen entferne, kann ich es sehen, aber es ist ziemlich klein.

+1

Warum verwenden Sie BitsPerPixel? Das glaube ich ist für Farbtiefe? –

+0

Ja ... http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.beitsperpixel.aspx –

Antwort

5

Ihnen ist bekannt, dass BitsPerPixel beschreibt die Farbtiefe (die Anzahl der Speicherbits, die zur Beschreibung der Farbe eines Pixels verwendet werden), und hat nichts mit der Auflösung zu tun?

Ich gehe davon aus, dass, was Sie tun möchten, den Text in einer Größe zu zeichnen ist, die auf die Auflösung zusammenhängt, die Sie unter Bezugnahme auf die DpiX und DpiY Eigenschaften des Graphics Objekt tun kann.

aktualisieren

Ich bin nicht sicher, ob yo Dpi in die Berechnung für diese mitbringen müssen. Alles, was Sie tun müssen, ist ein Rechteck zu erstellen, das die gewünschte Größe Ihres Textes definiert, und dann die korrekte Schriftgröße zu berechnen, damit der Text in das Rechteck passt. Folgendes tut das (maximiert aber die Textgröße sowohl in vertikaler als auch in horizontaler Richtung). Es könnte Ihnen einige Hinweise Ihr Problem zu lösen:

Bitmap bm = new Bitmap(50, 50); 
using (Font font = new Font(fontName, 10, GraphicsUnit.Point)) 
using (Graphics g = Graphics.FromImage(bm)) 
{ 
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
    StringFormat stringFormat = new StringFormat() 
    { 
     Alignment = StringAlignment.Center, 
     LineAlignment = StringAlignment.Near 
    }; 
    Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height); 
    // measure how large the text is on the Graphics object with the current font size 
    SizeF s = g.MeasureString(text, font); 
    // calculate how to scale the font to make the text fit 
    float fontScale = Math.Max(s.Width/rect.Width, s.Height/rect.Height); 
    using (Font fontForDrawing = new Font(font.FontFamily, font.SizeInPoints/fontScale, GraphicsUnit.Point)) 
    { 
     g.DrawString(text, fontForDrawing, Brushes.Black, rect, stringFormat); 
    } 


} 

Und wenn Sie den Text mit einer bestimmten Punktgröße ausdrucken möchten, Sie brauchen sich nicht um die Messung zu gehen; nur die Schriftgröße einstellen:

Bitmap bm = new Bitmap(20, 20); 
using (Font font = new Font(fontName, 6, GraphicsUnit.Point)) 
using (Graphics g = Graphics.FromImage(bm)) 
{ 
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
    StringFormat stringFormat = new StringFormat() 
    { 
     Alignment = StringAlignment.Center, 
     LineAlignment = StringAlignment.Near 
    }; 
    Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height); 
    g.DrawString(text, font, Brushes.Black, rect, stringFormat); 
} 
+0

Nein, bin ich nicht, lol. Wie kann ich also erzwingen, dass ein Text in der gewünschten Höhe geschrieben wird? –

+0

Ich aktualisiere mit einem Codebeispiel, das Ihnen vielleicht eine Richtung geben könnte. –

+0

Vielen Dank. Netter Code. Problem ist, dass (wie in meinem ursprünglichen Code), die Größe der Schriftart scheint nicht zu sein, was Sie es einstellen. Es ist immer viel kleiner. –

0

Ich würde versuchen:

int ImgQual = 600; 

int Width = 50; 

int Height = 50; 

Font TextFont = New Font("Tahoma", 14, FontStyle.Bold) 

Bitmap bmp = New Bitmap(Width, Height); 

bmp.SetResolution(ImgQual, ImgQual); 

System.Drawing.Graphics g = Graphics.FromImage(bmp); 

System.Drawing.StringFormat sf = New System.Drawing.StringFormat(); 

sf.Alignment = StringAlignment.Center; 

g.DrawString("a", NumberTextFont, Brushes.Black, New RectangleF(0, 0, Width, Height), sf); 

return bmp; 
+0

Setzen Sie Ihren Code zur besseren Lesbarkeit bitte in einen Codeblock. –

+0

ImageQualitySetting <- Woher kommt das? Ich habe gegoogelt und ich kann seinen Namensraum nicht finden. –

+0

Entschuldigung, ich habe diesen Code von einem Projekt abgeschnitten, an dem ich gerade gearbeitet habe. Die Bildqualität ist vom Typ Integer. – Avitus

1

Es gibt zwei Hauptgründe, die „a“ ist klein:

Die Höhe einer Schriftart wird gemessen, um einen Punkt mit Größe (die 1/72 eines Zolls ist, ziemlich verschieden von einer Anzahl von Pixeln, weil verschiedene Computerbildschirme unterschiedliche Anzahlen von Pixeln pro Zoll haben).

Die Schrifthöhe wird vom oberen Rand einer Textzeile bis zum unteren Rand gemessen. Da einige Buchstaben Oberlängen haben (die große Leiste in "h") und andere Unterlängen haben (das dangly Bit eines "g"), wird ein "a" nur etwa ein Drittel der Höhe der Schriftart einnehmen.

Wenn Sie möchten, dass Ihr "a" das Bild ausfüllt, müssen Sie es in ein größeres Rechteck zeichnen und die leeren Bereiche oberhalb und unterhalb des "a" abschneiden. Wenn Sie sich nicht zu viele Gedanken über den DPI-Bildschirm auf verschiedenen Computern machen, können Sie einfach experimentieren, bis Sie eine Schriftgröße (und eine Position zum Zeichnen) gefunden haben, die funktioniert.