Нарисуйте текст с обводкой на изображение в .Net - PullRequest
2 голосов
/ 05 января 2010

В настоящее время я использую метод System.Drawing.Graphics.DrawString () в .Net, чтобы нарисовать текст поверх изображения, а затем сохранить его в новом файле:

// define image file paths
string sourceImagePath = HttpContext.Current.Server.MapPath("~/img/sourceImage.jpg");
string destinationImagePath = HttpContext.Current.Server.MapPath("~/img/") + "finalImage.jpg";

// create new graphic to draw to
Bitmap bm = new Bitmap(200, 200);
Graphics gr = Graphics.FromImage(bm);

// open and draw image into new graphic
System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(sourceImagePath, true);
gr.DrawImage(sourceImage, 0, 0);
sourceImage.Dispose();

// write "my text" on center of image
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;

PrivateFontCollection fontCollection = new PrivateFontCollection();
fontCollection.AddFontFile(HttpContext.Current.Server.MapPath("~/fonts/HelveticaNeueLTStd-BlkCn.ttf"));
// prototype (1)
gr.DrawString("my text", new Font(fontCollection.Families[0], 14, FontStyle.Bold), new SolidBrush(Color.FromArgb(255, 255, 255)), 100, 0, sf);
fontCollection.Dispose();

// save new image
if (File.Exists(destinationImagePath))
{
    File.Delete(destinationImagePath);
}
bm.Save(destinationImagePath);
bm.Dispose();
gr.Dispose();

Этот метод добавления текста на изображение не обеспечивает (как мне известно) способ добавления обводки к тексту. Например, что мне действительно нужно сделать, это добавить 2px обводки определенного цвета к тексту, который написан на изображении.

Как это можно сделать с помощью .Net Framework <= v3.5? </p>

Ответы [ 3 ]

5 голосов
/ 05 января 2010

Весь текст имеет штрихов .

Если под штрихом вы подразумеваете контур, то вы создаете GraphicsPath и добавляете строку, используя AddString, затем вы можете обвести контур, используя DrawPath вместо FillPath, как в примере на MSDN.

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        // Create a GraphicsPath object.
        GraphicsPath myPath = new GraphicsPath();

        // Set up all the string parameters.
        string stringText = "Sample Text";
        FontFamily family = new FontFamily("Arial");
        int fontStyle = (int)FontStyle.Italic;
        int emSize = 96;
        Point origin = new Point(20, 20);
        StringFormat format = StringFormat.GenericDefault;

        // Add the string to the path.
        myPath.AddString(stringText,
            family,
            fontStyle,
            emSize,
            origin,
            format);

        //Draw the path to the screen.
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        e.Graphics.FillPath(Brushes.BlanchedAlmond, myPath);
        e.Graphics.DrawPath(new Pen(Brushes.Azure, 2), myPath);
    }

Если под штрихом вы имеете в виду страйк , тогда используйте стиль шрифта Strikeout .

Если под штрихом вы имеете в виду с засечками , то используйте другой шрифт.

0 голосов
/ 05 января 2010

Немного хак, но вы можете наложить два набора текста один поверх другого, при этом нижний слой немного увеличится. Может не работать идеально для всех шрифтов, но стоит попробовать.

0 голосов
/ 05 января 2010

Не уверен, что это именно то, что вам нужно, но попробуйте использовать LinearGradientBrush вместо SolidBrush в вашем коде.

Я не уверен, что вы подразумеваете под "штрихом" в этом вопросе, но если вы хотите, например, чтобы все пиксели в строках 7 и 8 были красными, вы можете использовать System.Drawing.TextureBrush вместо SolidBrush , Вы должны создать Bitmap ширину в один пиксель и достаточно высокий для вашего шрифта (все черные, кроме строк 7 и 8, которые будут красными), а затем использовать конструктор для TextureBrush, который принимает это Bitmap в качестве параметра.

...