44 votes

Écrire du texte sur une image en C#

J'ai le problème suivant. Je veux faire des graphiques dans une image bitmap comme une forme de lien.

je peux écrire un texte dans une image
mais j'écrirai d'autres textes dans différentes positions

Bitmap a = new Bitmap(@"path\picture.bmp");

using(Graphics g = Graphics.FromImage(a))
{
    g.DrawString(....); // requires font, brush etc
}

Comment puis-je écrire un texte et le sauvegarder, et écrire un autre texte dans l'image sauvegardée.

6 votes

Quelle est votre question ? Quel est le problème que vous rencontrez ?

2 votes

Vous avez ajouté une question, mais n'avez pas décrit le problème réel que vous rencontrez en faisant cela.

96voto

Jalal Aldeen Saa'd Points 9120

Pour dessiner plusieurs chaînes, appelez graphics.DrawString plusieurs fois. Vous pouvez spécifier l'emplacement de la chaîne dessinée. Dans cet exemple, nous allons dessiner deux chaînes "Hello", "Word" ("Hello" en couleur bleue devant "Word" en couleur rouge) :

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

Edit : "J'ajoute un code de chargement et de sauvegarde".

Vous pouvez ouvrir le fichier bitmap à tout moment. Image.FromFile et dessinez un nouveau texte dessus en utilisant le code ci-dessus, puis enregistrez le fichier image. bitmap.Save

0 votes

@wahab : vérifiez les éditions de la réponse. est-ce que c'est ce que vous demandez ?

0 votes

@wahab : C'est généralement un problème dans le chemin du fichier. Vérifiez votre chemin de fichier, un chemin correct ressemble à : `string path = @" C:\my image.bmp" ;

0 votes

Using(Graphics graphics = Graphics.FromImage(bitmap)) { using (Font arialFont = new Font("Arial", 10) { graphics.DrawString(firstText, arialFont, Brushes.Blue, firstLocation) ; bitmap.Save(newpath);//save the image file graphics.DrawString(secondText, arialFont, Brushes.Red, secondLocation) ; bitmap.Save(newpath);//save the image file } } cela a fonctionné

6voto

George Duckett Points 17305

Voici un exemple d'appel à Graphics.DrawString , tiré de aquí :

g.DrawString("My\nText", new Font("Tahoma", 40), Brushes.White, new PointF(0, 0));

Cela dépend évidemment de la présence d'une police appelée Tahoma installé.

Le site Brushes possède de nombreuses brosses intégrées.

Voir aussi, la page MSDN pour Graphics.DrawString .

6voto

Ibrahim Points 143

Pour enregistrer les changements dans le même fichier, j'ai dû combiner Jalal Said et la réponse de NSGaga Réponse de la Commission sur este question. Vous devez créer un nouveau Bitmap sur la base de l'ancien objet, éliminer l'ancien Bitmap puis enregistrez en utilisant le nouvel objet :

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();

1voto

    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);
        }
    }

0 votes

J'ai trouvé une solution plus appropriée et celle-ci fonctionne pour moi. Grâce à celle-ci, nous pouvons ajouter du texte de manière dynamique dans différentes positions. Double cliquez sur l'image, où vous voulez ajouter du texte. Rappelez-vous que la taille de l'image doit rester normale, sinon, avec la position de la souris, la position originale où vous voulez ajouter du texte ne sera pas détectée. Et grâce à cette solution, vous pouvez enregistrer correctement l'image modifiée.

-8voto

sdasdasdasd Points 39

Si quelqu'un a des problèmes avec ces lignes de code :

using(Graphics graphics = Graphics.FromImage(bitmap))

La solution est :

Bitmap bitmap = (Bitmap)**System.Drawing.Image.FromFile**(@"C:\Documents and Settings\", true);

1 votes

Quel est le problème que cela est censé résoudre ? La ligne de code originale est simple et claire et devrait fonctionner. La nouvelle ligne de code... Je ne suis même pas sûr de ce qu'elle fait, et je ne peux certainement pas dire pourquoi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X