- Назовите ваши элементы управления.Не используйте «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 возвращает все файлы в каталоге, файл без изображения может вызвать исключение.Это можно было бы сделать намного аккуратнее, но, поскольку это был не характер вашего вопроса, я оставил его простым.