web-dev-qa-db-fra.com

Écrire du texte sur une image en C #

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

je peux écrire un texte dans l'image
mais j'écrirai plus de texte 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 du texte et l'enregistrer, et écrire un autre texte dans l'image enregistrée.

27
Mr Alemi

Pour dessiner plusieurs chaînes, appelez graphics.DrawString plusieurs fois. Vous pouvez spécifier l'emplacement de la chaîne dessinée. Cet exemple, nous allons dessiner deux chaînes "Bonjour", "Word" ("Bonjour" en bleu en amont "Word" en 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 une charge et sauvegarde le code".

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

67
Jalal Said

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

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

Il repose évidemment sur une police appelée Tahoma installée.

La classe Brushes possède de nombreux pinceaux intégrés.

Voir aussi, la page MSDN pour Graphics.DrawString .

3
George Duckett

Pour enregistrer les modifications dans le même fichier, j'ai dû combiner la réponse de Jalal Said et la réponse de NSGaga sur la question this . Vous devez créer un nouvel objet Bitmap basé sur l'ancien, supprimer 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();
2
Ibrahim