C #: использование Drawstring для аннотирования изображений работает, но не удается получить текст в левом нижнем углу, только в правом нижнем углу - PullRequest
0 голосов
/ 29 декабря 2011

Я создаю инструмент для создания водяных знаков для себя и некоторых других на работе, и использование следующего кода позволяет мне комментировать текст в правом нижнем углу изображения, но я не могу сделать его аннотацией в левом нижнем углу без вручную настраивая координаты, которые отличаются для любого данного изображения. Кроме того, изменение StringAlignment.Far на StringAlignment.Near и т. Д. Ничего не делает, но возможно комментирует текст вне изображения где-то, что не отображается.

В MSDN есть объяснение , но оно мне не помогает. Любая помощь была бы велика, я боролся с этим в течение некоторого времени.

private void button1_Click(object sender, EventArgs e)
{
    foreach (string images in Directory.GetFiles(textBox1.Text))
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(images);

        Graphics gr = Graphics.FromImage(img);

        Font font = new Font("Times New Roman", (float)25, 
            System.Drawing.FontStyle.Regular);
        System.Drawing.Color color = System.Drawing.Color.Red;

        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Far;
        stringFormat.LineAlignment = StringAlignment.Far;

        gr.SmoothingMode = SmoothingMode.AntiAlias;

        gr.DrawString("WATERMARK GOES HERE"+ images, font, 
            new System.Drawing.SolidBrush(color), 
            new System.Drawing.Point(img.Width - 0, img.Height - 0), 
            stringFormat);

        MemoryStream outputStream = new MemoryStream();
        img.Save(images+"Stamped.jpg");
    }

    MessageBox.Show("done");
}

1 Ответ

3 голосов
/ 29 декабря 2011
  • Назовите ваши элементы управления.Не используйте «button1», «textbox1» и т. Д.
  • Используйте выражение «using».Написание «System.Drawing.Point» и других полностью определенных имен просто увеличивает размер вашего кода и усложняет его чтение.
  • Вы создаете новый экземпляр класса SolidBrush для каждого изображения, на которое нанесен водяной знак.Вы должны создать кисть перед циклом и просто использовать ее в цикле, а затем утилизировать ее.
  • Ваше объявление MemoryStream ничего не делает и нигде не используется.

Какдля самого водяного знака вы должны решить, хотите ли вы, чтобы он масштабировался в соответствии с размером изображения или был согласованным.Или вы можете иметь максимальный / минимальный размер.Это ваше предпочтение.

private void watermark_btn_Click(object sender, EventArgs e)
{
    string watermarkText = "ShowThisWatermark";

    using (Font font = new Font("Times New Roman", (float)25, FontStyle.Regular))
    using (SolidBrush brush = new SolidBrush(Color.Red))
    foreach (string file in Directory.GetFiles(directory_txt.Text))
    {
        try
        {
            Bitmap b = new Bitmap(file);

            using (Graphics g = Graphics.FromImage(b))
            {
                g.SmoothingMode = SmoothingMode.AntiAlias;

                SizeF measuredSize = g.MeasureString(watermarkText, font);

                // Use this to watermark the bottom-left corner
                g.DrawString(watermarkText, font, brush, 0, b.Height - measuredSize.Height);

                // Use this to watermark the bottom-right corner
                g.DrawString(watermarkText, font, brush, b.Width - measuredSize.Width, b.Height - measuredSize.Height);
            }

            b.Save(Path.GetFileNameWithoutExtension(file) + "_stamped" + Path.GetExtension(file));
        }
        catch
        {
            continue;
        }
    }
}

Try / catch - это ленивый способ пропустить файлы, которые не являются изображениями.Поскольку Directory.GetFiles возвращает все файлы в каталоге, файл без изображения может вызвать исключение.Это можно было бы сделать намного аккуратнее, но, поскольку это был не характер вашего вопроса, я оставил его простым.

...