2009-06-17 5 views
2

J'ai essayé de le faire, mais pour une raison quelconque c'est juste me donner des résultats étranges:(C#) Comment dessiner un « un » avec Tahoma hauteur = 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; 

Que suis-je faire mal ici? Je ne vois rien d'imprimé sur l'image. Si je supprime toutes les références bpp, je peux le voir, mais c'est plutôt petit.

+1

Pourquoi utilisez-vous BitsPerPixel? Cela, je crois est pour la profondeur de couleur? –

+0

Oui ... http://msdn.microsoft.com/fr-fr/library/system.windows.forms.screen.bitsperpixel.aspx –

Répondre

5

Vous savez que BitsPerPixel décrit la profondeur de couleur (le nombre de bits de mémoire utilisés pour décrire la couleur d'un pixel) et n'a rien à voir avec la résolution?

Je suppose que ce que vous voulez faire est de dessiner le texte dans une taille qui est liée à la résolution, que vous pouvez faire en se référant aux DpiX et DpiY propriétés de l'objet Graphics.

Mise à jour

Je ne sais pas si yo besoin d'apporter Dpi dans le calcul pour cela. Tout ce que vous devez faire est de créer un rectangle qui définit la taille désirée de votre texte, puis de calculer la taille de police correcte pour que le texte s'insère dans le rectangle. Ce qui suit fait cela (mais maximise la taille du texte à la fois verticale et horizontale direction). Il peut vous donner quelques conseils pour résoudre votre problème:

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); 
    } 


} 

Et si vous voulez imprimer le texte avec une taille de point donné, vous n'avez pas besoin d'aller sur mesure; juste définir la taille de la police:

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

Non, je ne suis pas, lol. Alors, comment puis-je forcer un texte à écrire avec la hauteur désirée? –

+0

J'ai mis à jour avec un échantillon de code qui pourrait vous donner une certaine direction. –

+0

Merci beaucoup. Bon code. Le problème est que (comme dans mon code d'origine), la taille de la police ne semble pas être celle que vous avez définie. Elle est toujours beaucoup plus petite. –

0

Je voudrais essayer:

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

Mettez votre code dans un bloc de code pour la lisibilité s'il vous plaît. –

+0

ImageQualitySetting <- D'où cela vient-il? J'ai googlé et je n'arrive pas à trouver son espace de noms. –

+0

Désolé, j'ai coupé ce code d'un projet sur lequel je travaillais. La qualité de l'image est de type entier. – Avitus

1

Il y a deux principales raisons "a" est petit:

La hauteur d'une police est mesurée à l'aide d'un point taille (qui est 1/72nd de pouce, tout à fait différent d'un certain nombre de pixels, car différents écrans d'ordinateur ont des nombres différents de pixels par pouce).

La hauteur de police est mesurée à partir du haut d'une ligne de texte vers le bas. Comme certaines lettres ont des ascendeurs (la barre haute dans "h") et d'autres ont des descendants (le morceau dangly d'un "g"), un "a" occupera seulement environ un tiers de la hauteur de la police.

Si vous souhaitez que votre "a" remplisse l'image, vous devrez le dessiner dans un rectangle plus grand et "découper" les régions vides au-dessus et au-dessous du "a". Si vous n'êtes pas trop inquiet à propos de l'écran DPI sur différents ordinateurs, vous pouvez simplement expérimenter jusqu'à ce que vous trouviez une taille de police (et une position à dessiner) qui fonctionne.

Questions connexes