Fusionando dos imágenes en C # /. NET

87

Idea simple: tengo dos imágenes que quiero fusionar, una es 500x500 que es transparente en el medio y la otra es 150x150.

La idea básica es la siguiente: cree un lienzo vacío de 500x500, coloque la imagen de 150x150 en el medio del lienzo vacío y luego copie la imagen de 500x500 para que el medio transparente permita que el 150x150 brille.

Sé cómo hacerlo en Java, PHP y Python ... Simplemente no tengo idea de qué objetos / clases usar en C #, un ejemplo rápido de copiar una imagen en otra sería suficiente.

thr
fuente

Respuestas:

99

Básicamente, uso esto en una de nuestras aplicaciones: queremos superponer un ícono de reproducción sobre un cuadro de un video:

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
fuente
10
¡GRACIAS! Hoy me salvé totalmente el tocino
Jason More
¿A @downvoter le importa explicarlo para que pueda mejorar mi respuesta?
Andreas Niedermair
5
@AndreasNiedermair, el votante en contra probablemente copió pegó su código y no funcionó
Jean-Paul
¡Es una respuesta de oro tal como está!
DmitryBoyko
60

Esto agregará una imagen a otra.

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

Los gráficos están en el espacio de nombres System.Drawing

Dustin Brooks
fuente
33

Después de todo esto, encontré un nuevo método más fácil, prueba esto ...

Puede unir varias fotos juntas:

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
fuente
4
funcionó muy bien. g.Clear (Color.Transparent) si desea combinar imágenes PNG para los sprites de animación
syclee
1
imagen final = nuevo System.Drawing.Bitmap (ancho, alto); arroja un error para valores altos de ancho / alto
zeetit
@Anant Dabhi De acuerdo, lamento traer una vieja pregunta, pero la convertí a VB.NET. ¿Se superpondrá esto a otras fotos si las coloco una sobre otra si los píxeles no utilizados / píxeles en blanco en la siguiente imagen son transparentes? Si no es así, ¿hay alguna forma de hacerlo?