webForumDet fria alternativet

Text inom en bitmaps ramar

.NETur .NET

3 svar · 187 visningar · startad av Dino

Medlem sedan sep. 20011 914 inlägg
Frågan#1

Skapar en bitmap och i den skall en string ritas. Textens position skall slumpas fram. Behöver en bra uträkning för det och även så att texten hamnar inom bitmapen. Om tex bitmapen är 200 * 200 och textens x position blir 190 då kommer ju en del av texten att hamna utanför. Nedan är lite kod att börja med.

public static Bitmap WordImage(string text, int width, int height)
        {
            string[] fonts = {"Arial", "Verdana", "Courier New", "Times", "Times New Roman", "Tahoma", "Courier", "Georgia"}; 
            int fSize = new Random().Next(8, 18);
            int posX = new Random().Next(0, width);
            int posY = new Random().Next(0, height) - (fSize / 2);
            
            Font f = new Font(fonts[new Random().Next(0, fonts.Length)], fSize);

            Bitmap bit = new Bitmap(width, height);
            Graphics grap = Graphics.FromImage(bit);
            grap.Clear(Color.Beige);

            grap.DrawString(text, f, Brushes.Red, posX, posY);

            return bit;
        }
Medlem sedan apr. 20012 266 inlägg
#2

1. Ta reda på hur lång strängen kommer att bli
2. Slumpa positionen utefter strängens längd, dvs slumpa ett värde mellan 0 och 200-strängenslängd.
3. Relativt klar... :)

Medlem sedan sep. 20011 914 inlägg
#3

Och hur skulle 1:an gå till. Att ta text.Length säger ju ingenting om hur lång texten.

red// Ok, tror jag hittat ett sätt. Lägger upp det om det fungerar.

Medlem sedan sep. 20011 914 inlägg
#4

Det här verkar funka. :)

public static Bitmap WordImage(string text, int width, int height)
        {
            string[] fonts = {"Arial", "Verdana", "Courier New", "Times", "Times New Roman", "Tahoma", "Courier", "Georgia"}; 
            int fSize = new Random().Next(8, 18);
            
            Font f = new Font(fonts[new Random().Next(0, fonts.Length)], fSize);
            
            Bitmap bit = new Bitmap(width, height);
            Graphics grap = Graphics.FromImage(bit);
            grap.Clear(Color.Beige);
            SizeF sf = grap.MeasureString(text, f);

            int posX = new Random().Next(0, width) - Convert.ToInt32(sf.Width);
            int posY = new Random().Next(0, height) - Convert.ToInt32(sf.Height);
            if(posX < 0) posX = width / 2;
            if(posY < 0) posY = height / 2;
            
            grap.DrawString(text, f, Brushes.Red, posX, posY);

            return bit;
        }
136 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)