Zusammenführen von zwei Bildern in C # /. NET

86

Einfache Idee: Ich habe zwei Bilder, die ich zusammenführen möchte. Eines ist 500 x 500, das in der Mitte transparent ist, das andere ist 150 x 150.

Die Grundidee lautet: Erstellen Sie eine leere Leinwand mit einer Größe von 500 x 500, positionieren Sie das 150 x 150-Bild in der Mitte der leeren Leinwand und kopieren Sie das 500 x 500-Bild so, dass die transparente Mitte 150 x 150 durchscheinen kann.

Ich weiß, wie es in Java, PHP und Python geht ... Ich habe nur keine Ahnung, welche Objekte / Klassen in C # verwendet werden sollen. Ein kurzes Beispiel für das Kopieren von Bildern in ein anderes würde ausreichen.

thr
quelle

Antworten:

99

Grundsätzlich verwende ich dies in einer unserer Apps: Wir möchten ein Playicon über einen Frame eines Videos legen:

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
quelle
10
VIELEN DANK! Habe heute meinen Speck total gerettet
Jason More
@downvoter möchten Sie näher darauf eingehen, damit ich meine Antwort verbessern kann?
Andreas Niedermair
5
@AndreasNiedermair der Down-Voter hat wahrscheinlich Ihren Code eingefügt und hat nicht funktioniert
Jean-Paul
Es ist eine goldene Antwort wie es ist!
Entwickler
60

Dadurch wird ein Bild zu einem anderen hinzugefügt.

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

Grafiken befinden sich im Namespace System.Drawing

Dustin Brooks
quelle
31

Nach all dem fand ich eine neue einfachere Methode, versuchen Sie dies ..

Es können mehrere Fotos zusammengefügt werden:

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
quelle
4
hat super funktioniert. g.Clear (Color.Transparent), wenn Sie PNG-Bilder für Animations-Sprites zusammenführen
möchten
1
finalImage = new System.Drawing.Bitmap (Breite, Höhe); wirft Fehler für hohe Werte von Breite / Höhe
zeetit
@Anant Dabhi Okay, es tut mir leid, eine alte Frage zurückzubringen, aber ich habe diese in VB.NET konvertiert. Überlagert dies andere Fotos, wenn ich sie übereinander lege, wenn die nicht verwendeten Pixel / leeren Pixel auf dem nächsten Bild transparent sind? Wenn nicht, gibt es eine Möglichkeit, dies zu tun?