在运行时向图像添加注释

时间:2014-05-24 14:32:52

标签: c# .net winforms graphics

我正在尝试开发一个能够实现的简单应用程序(C#,WinForms,Visual Studio 2013):

1) 从硬盘加载图片;

2) 为图片添加anotations并保存修改(换句话说,用户可以在运行时在图像上绘制字符串(在任何地方))。

为了加载我做的图像:

private void LoadButton_Click(object sender, EventArgs e)
    {
        OpenFileDialog theDialog = new OpenFileDialog();
        theDialog.Title = "Open Image File";
        theDialog.Filter = "Image Files|*.jpg;*jpeg;*.png;*.gif;*.bmp;*.tiff;";
        theDialog.InitialDirectory = @"C:\";
        if (theDialog.ShowDialog() == DialogResult.OK)
        {
            pictureBox.Image = Image.FromFile(theDialog.FileName);
        }
    }

但我无法弄清楚如何实现第二次任务。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:4)

使用Graphis.DrawString method在指定位置添加文本(使用指定的颜色,字体系列,字体大小等):

try
{           
    var image = Image.FromFile("d:\\temp\\image.jpg");
    using (var graphics = Graphics.FromImage(image))
    {
        var font = new Font(FontFamily.GenericSansSerif, 16.0f);
        graphics.DrawString("copyright 2014", font, Brushes.Red, new Point(10, 10));
    }
    image.Save("d:\\temp\\image_copyright.jpg");
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}

原始图片:

enter image description here

添加文字:

enter image description here

尽可能(并且适当)尝试始终将Graphics对象的创建包装在using语句中。使用Graphics.FromImage method从现有图像创建图形对象(如您的情况)。这样,对于不再需要的对象的处理将由框架自动完成。使用Point对象将文字放在所需位置,其中(0,0)位于图片的左上角。


<强>更新

如果要在PictureBox的自定义位置添加文本,请绑定PictureBox.MouseClick事件,将坐标转换为客户端坐标,使用转换后的鼠标坐标将文本放在在修改图像后对图像进行图像处理并刷新PictureBox控件:

private void pictureBox_MouseClick(object sender, MouseEventArgs e)
{
    var text = !String.IsNullOrEmpty(textBox.Text) ? textBox.Text : "copyright 2014";
    var imageCoordinates = translateStretchImageMousePosition(new Point(e.X, e.Y));
    using (var graphics = Graphics.FromImage(pictureBox.Image))
    {
        var font = new Font(FontFamily.GenericSansSerif, 16.0f);
        graphics.DrawString(text, font, Brushes.Red, imageCoordinates);
    }
    pictureBox.Refresh();
}

输出结果为:

enter image description here

由于PictureBox具有不同的图像大小调整模式,因此您需要以不同方式计算点击坐标。如何执行此操作显示在CodeProject article中。您还可以尝试使用.NET框架提供的不同client coordinate translation functions

答案 1 :(得分:3)

您可以使用此代码

FileStream FILESTRM = new FileStream(@"INPUT_FILE_PATH", FileMode.Open, FileAccess.Read);
Image IMG = Image.FromStream(FILESTRM);
FILESTRM.Close();
Bitmap b = new Bitmap(IMG);
Graphics graphics = Graphics.FromImage(b);
//                   Custom         Font       Text Color    Text
//                    Text          Name           ||       Position
//                     \/            \/            \/         \/
graphics.DrawString("YOUR STRING", this.Font, Brushes.Black, 0, 0);
b.Save(@"OUTPUT_FILE_PATH", IMG.RawFormat);
IMG.Dispose();
b.Dispose();