Написать текст на изображении (указанная ширина) - PullRequest
2 голосов
/ 16 марта 2012

current example

Я создаю ICards для сотрудников. Я должен написать адрес сотрудника на ICard.

            Image blankICard = Image.FromFile(@"C:\Users\admin\Pictures\filename.jpg");

            Bitmap outputImage = new Bitmap(blankICard.Width, blankICard.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            System.Drawing.SolidBrush b = new SolidBrush(Color.FromArgb(255, 88, 89, 91));
            using (Graphics graphics = Graphics.FromImage(outputImage))
            {
                graphics.DrawImage(blankICard, new Rectangle(0, 0, blankICard.Width, blankICard.Height),
                new Rectangle(new Point(), blankICard.Size), GraphicsUnit.Pixel);

                Font stringFont = new Font("FreightSans Medium", 20, FontStyle.Regular);

                string address = "Address goes here";

                graphics.DrawString(address, new Font("FreightSans Medium", 20, FontStyle.Regular), b, new Point(621, 234));
                graphics.DrawString("Employee Code:12345678", new Font("FreightSans Medium", 26, FontStyle.Regular), b, new Point(350, 407));
            }

Токовый выход показан в левой части изображения. Вот что происходит, когда моя строка выходит из коробки.

Я хочу связать его в поле фиксированного размера.

Пример показан в правой части изображения.

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Используйте Graphics.DrawString перегрузку, которая принимает Rectangle вместо точки. Таким образом, вы будете обтекать текст так, чтобы он соответствовал указанной ширине.

using (Graphics graphics = Graphics.FromImage(outputImage)){
  // Draw whatever you need first
  // ....
  // Create font...
  graphics.DrawString(employeeCode, font, Brushes.Black,
                       new Rectangle(0, 25, maxWidth, maxHeight);
}

Просто так:)

2 голосов
/ 16 марта 2012

Я внес некоторые изменения в ваш код, комментируя 2 строки - у меня не было файла C:\Users\admin\Pictures\filename.jpg на моем компьютере - вот почему blankICard был отключен, как и его Rectangle:

Вы должны установить maxWidth, чтобы обернуть ваш код сотрудника, например.

     //  Image blankICard = Image.FromFile(@"C:\Users\admin\Pictures\filename.jpg");
        int width = 500;
        int height = 500;

        Bitmap outputImage = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        System.Drawing.SolidBrush b = new SolidBrush(Color.FromArgb(255, 88, 89, 91));
        SolidBrush blackBrush = new SolidBrush(Color.Black);
        using (Graphics graphics = Graphics.FromImage(outputImage))
        {
            graphics.DrawRectangle( new Pen(blackBrush) ,new Rectangle(0, 0, width, height));

     //  new Rectangle(new Point(), blankICard.Size), GraphicsUnit.Pixel);

            Font stringFont = new Font("FreightSans Medium", 20, FontStyle.Regular);


            string address = "Address goes here";

            string employeeCode = "Employee Code:12345678";
            int maxWidth = 30;
            SizeF sf = graphics.MeasureString(employeeCode,
                            new Font(new FontFamily("FreightSans Medium"), 26), maxWidth);

            graphics.DrawString(address, new Font("FreightSans Medium", 20, FontStyle.Regular), b, new Point(0, 0));

            graphics.DrawString(employeeCode,
                            new Font(new FontFamily("FreightSans Medium"), 26), Brushes.Black,
                            new RectangleF(new PointF(0, 25), sf),
                            StringFormat.GenericTypographic); 




            //graphics.DrawString(, new Font("FreightSans Medium", 26, FontStyle.Regular), b, new Point(10, 20));
        }
...