Fusion de deux images dans C # /. NET

87

Idée simple: j'ai deux images que je souhaite fusionner, l'une est de 500x500 qui est transparente au milieu, l'autre est de 150x150.

L'idée de base est la suivante: créez une toile vide de 500x500, positionnez l'image 150x150 au milieu de la toile vide, puis copiez l'image 500x500 de sorte que le milieu transparent de celle-ci permette au 150x150 de briller.

Je sais comment le faire en Java, PHP et Python ... Je n'ai simplement aucune idée des objets / classes à utiliser en C #, un exemple rapide de copie d'une image dans une autre suffirait.

thr
la source
est-ce que cela aide? daniweb.com/forums/thread87993.html
Dror

Réponses:

99

En gros, je l'utilise dans l'une de nos applications: nous voulons superposer un playicon sur une image d'une vidéo:

Image playbutton;
try
{
    playbutton = Image.FromFile(/*somekindofpath*/);
}
catch (Exception ex)
{
    return;
}

Image frame;
try
{
    frame = Image.FromFile(/*somekindofpath*/);
}
catch (Exception ex)
{
    return;
}

using (frame)
{
    using (var bitmap = new Bitmap(width, height))
    {
        using (var canvas = Graphics.FromImage(bitmap))
        {
            canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
            canvas.DrawImage(frame,
                             new Rectangle(0,
                                           0,
                                           width,
                                           height),
                             new Rectangle(0,
                                           0,
                                           frame.Width,
                                           frame.Height),
                             GraphicsUnit.Pixel);
            canvas.DrawImage(playbutton,
                             (bitmap.Width / 2) - (playbutton.Width / 2),
                             (bitmap.Height / 2) - (playbutton.Height / 2));
            canvas.Save();
        }
        try
        {
            bitmap.Save(/*somekindofpath*/,
                        System.Drawing.Imaging.ImageFormat.Jpeg);
        }
        catch (Exception ex) { }
    }
}
Andreas Niedermair
la source
10
MERCI! Totalement sauvé mon bacon aujourd'hui
Jason More
@downvoter souhaite élaborer, afin que je puisse améliorer ma réponse?
Andreas Niedermair
5
@AndreasNiedermair, le down-votant, a probablement copié votre code et n'a pas fonctionné
Jean-Paul
C'est une réponse en or comme ça!
DmitryBoyko
60

Cela ajoutera une image à une autre.

using (Graphics grfx = Graphics.FromImage(image))
{
    grfx.DrawImage(newImage, x, y)
}

Les graphiques sont dans l'espace de noms System.Drawing

Dustin Brooks
la source
33

Après tout cela, j'ai trouvé une nouvelle méthode plus simple, essayez ceci.

Il peut joindre plusieurs photos ensemble:

public static System.Drawing.Bitmap CombineBitmap(string[] files)
{
    //read all images into memory
    List<System.Drawing.Bitmap> images = new List<System.Drawing.Bitmap>();
    System.Drawing.Bitmap finalImage = null;

    try
    {
        int width = 0;
        int height = 0;

        foreach (string image in files)
        {
            //create a Bitmap from the file and add it to the list
            System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image);

            //update the size of the final bitmap
            width += bitmap.Width;
            height = bitmap.Height > height ? bitmap.Height : height;

            images.Add(bitmap);
        }

        //create a bitmap to hold the combined image
        finalImage = new System.Drawing.Bitmap(width, height);

        //get a graphics object from the image so we can draw on it
        using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(finalImage))
        {
            //set background color
            g.Clear(System.Drawing.Color.Black);

            //go through each image and draw it on the final image
            int offset = 0;
            foreach (System.Drawing.Bitmap image in images)
            {
                g.DrawImage(image,
                  new System.Drawing.Rectangle(offset, 0, image.Width, image.Height));
                offset += image.Width;
            }
        }

        return finalImage;
    }
    catch (Exception ex)
    {
        if (finalImage != null)
            finalImage.Dispose();

        throw ex;
    }
    finally
    {
        //clean up memory
        foreach (System.Drawing.Bitmap image in images)
        {
            image.Dispose();
        }
    }
}
Anant Dabhi
la source
4
a très bien fonctionné. g.Clear (Color.Transparent) si vous souhaitez fusionner des images PNG pour les sprites d'animation
syclee
1
finalImage = new System.Drawing.Bitmap (largeur, hauteur); jette une erreur pour les valeurs élevées de largeur / hauteur
zeetit
@Anant Dabhi D'accord, je suis désolé de ramener une vieille question, mais je l'ai convertie en VB.NET .. Est-ce que cela superposera d'autres photos si je les place les unes sur les autres si les pixels inutilisés / pixels vierges sur l'image suivante sont transparents? Sinon, y a-t-il un moyen de le faire?