Напишите текст на изображении в С#
У меня следующая проблема. Я хочу сделать графику в растровом изображении, например, в виде связи
я могу написать текст в изображении
но я напишу больше текста в разных позициях
Bitmap a = new Bitmap(@"path\picture.bmp");
using(Graphics g = Graphics.FromImage(a))
{
g.DrawString(....); // requires font, brush etc
}
Как я могу написать текст и сохранить его, а также написать другой текст в сохраненном изображении.
Ответы
Ответ 1
Чтобы нарисовать несколько строк, вызовите graphics.DrawString
несколько раз. Вы можете указать местоположение нарисованной строки. В этом примере мы нарисуем две строки "Hello", "Word" ("Hello" синим цветом, а "Word" красным цветом):
string firstText = "Hello";
string secondText = "World";
PointF firstLocation = new PointF(10f, 10f);
PointF secondLocation = new PointF(10f, 50f);
string imageFilePath = @"path\picture.bmp"
Bitmap bitmap = (Bitmap)Image.FromFile(imageFilePath);//load the image file
using(Graphics graphics = Graphics.FromImage(bitmap))
{
using (Font arialFont = new Font("Arial", 10))
{
graphics.DrawString(firstText, arialFont, Brushes.Blue, firstLocation);
graphics.DrawString(secondText, arialFont, Brushes.Red, secondLocation);
}
}
bitmap.Save(imageFilePath);//save the image file
Изменить: "Я добавляю код загрузки и сохранения".
Вы можете в любое время открыть файл растрового изображения Image.FromFile
и нарисовать на нем новый текст, используя приведенный выше код. а затем сохраните файл изображения bitmap.Save
Ответ 2
Здесь приведен пример вызова Graphics.DrawString
, взятого из здесь:
g.DrawString("My\nText", new Font("Tahoma", 40), Brushes.White, new PointF(0, 0));
Очевидно, он полагается на наличие шрифта с именем Tahoma
.
В классе Brushes
есть много встроенных кистей.
См. также страницу MSDN для Graphics.DrawString
.
Ответ 3
Чтобы сохранить изменения в том же файле, мне пришлось объединить Jalal Said и NSGaga ответьте на этот вопрос. Вам нужно создать новый объект Bitmap на основе старого, удалить старый объект Bitmap, а затем сохранить с помощью нового объекта:
string firstText = "Hello";
string secondText = "World";
PointF firstLocation = new PointF(10f, 10f);
PointF secondLocation = new PointF(10f, 50f);
string imageFilePath = @"path\picture.bmp";
Bitmap newBitmap;
using (var bitmap = (Bitmap)Image.FromFile(imageFilePath))//load the image file
{
using(Graphics graphics = Graphics.FromImage(bitmap))
{
using (Font arialFont = new Font("Arial", 10))
{
graphics.DrawString(firstText, arialFont, Brushes.Blue, firstLocation);
graphics.DrawString(secondText, arialFont, Brushes.Red, secondLocation);
}
}
newBitmap = new Bitmap(bitmap);
}
newBitmap.Save(imageFilePath);//save the image file
newBitmap.Dispose();
Ответ 4
public string imageFilePath = null;
public string textOnImage = null;
public Image baseImage;
public Image modifiedImage;
public int xcoOrdinate = 0;
public int ycoOrdinate = 0;
public Form1()
{
InitializeComponent();
}
private void buttonLoadImage_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog uploadfileDialog = new OpenFileDialog();
uploadfileDialog.Filter = "All Files (*.*)|*.*";
uploadfileDialog.Multiselect = false;
if (uploadfileDialog.ShowDialog() == DialogResult.OK)
{
imageFilePath = uploadfileDialog.FileName;
}
baseImage = Image.FromFile(imageFilePath);
modifiedImage = (Image)baseImage.Clone();
pictureBoxToShowPic.Image = baseImage;
}
catch (Exception ex)
{
MessageBox.Show(ex.Source + " : " + ex.Message);
}
}
public void paint()
{
try
{
Graphics g = Graphics.FromImage(modifiedImage);
using (Font myfont = new Font("Arial", 14))
{
var format = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
g.DrawString(textOnImage, myfont, Brushes.Black, new Point(xcoOrdinate, ycoOrdinate), format);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Source + " : " + ex.Message);
}
}
private void buttonAddText_Click(object sender, EventArgs e)
{
try
{
textOnImage = textBoxWriteText.Text;
paint();
pictureBoxToShowPic.Image = modifiedImage;
pictureBoxToShowPic.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Source + " : " + ex.Message);
}
}
private void pictureBoxToShowPic_MouseDoubleClick(object sender, MouseEventArgs e)
{
try
{
xcoOrdinate = e.X;
ycoOrdinate = e.Y;
}
catch (Exception ex)
{
MessageBox.Show(ex.Source + " : " + ex.Message);
}
}
private void buttonSaveImage_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog savefileDialog = new SaveFileDialog();
savefileDialog.Filter = "Images|*.jpg ; *.png ; *.bmp";
if (savefileDialog.ShowDialog() == DialogResult.OK)
{
imageFilePath = savefileDialog.FileName;
}
modifiedImage.Save(imageFilePath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Source + " : " + ex.Message);
}
}
Ответ 5
Если у кого-то возникают проблемы с этими кодовыми строками:
using(Graphics graphics = Graphics.FromImage(bitmap))
Решение:
Bitmap bitmap = (Bitmap)**System.Drawing.Image.FromFile**(@"C:\Documents and Settings\", true);