Merging two images in C#/.NET
Asked Answered
R

4

98

Simple idea: I have two images that I want to merge, one is 500x500 that is transparent in the middle the other one is 150x150.

Basic idea is this: Create an empty canvas that is 500x500, position the 150x150 image in the middle of the empty canvas and then copy the 500x500 image over so that the transparent middle of it allows the 150x150 to shine through.

I know how to do it in Java, PHP and Python... I just don't have any idea what objects/classes to use in C#, a quick example of copying an images into another would suffice.

Rooftop answered 21/1, 2009 at 12:52 Comment(1)
Does this help? daniweb.com/forums/thread87993.htmlBox
P
113

basically i use this in one of our apps: we want to overlay a playicon over a frame of a 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) { }
    }
}
Polypody answered 21/1, 2009 at 12:59 Comment(0)
A
64

This will add an image to another.

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

Graphics is in the namespace System.Drawing

Adenoid answered 21/1, 2009 at 12:58 Comment(0)
S
38

After all this, I found a new easier method try this ..

It can join multiple photos together:

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();
        }
    }
}
Smithy answered 13/7, 2012 at 14:56 Comment(3)
worked great. g.Clear(Color.Transparent) if you want to merge PNG images for animation spritesEnsconce
finalImage = new System.Drawing.Bitmap(width, height); throws error for high values of width/heightThose
@Anant Dabhi Okay I am sorry to bring back a old question, but I converted this to VB.NET.. Will this overlay other photos if I place them over each other if the unused pixels / blank pixels on the next image is transparent? If not, is there any way to do it?Incretion
L
0

This will place the images side by side Horizontally, and the resulting image is the height of the first image.

private Image IconCombiner(Image OriginalImage, Image ImageToAdd)
    {
        var bitmap = new Bitmap(OriginalImage.Width + ImageToAdd.Width, OriginalImage.Height);
        
        using (Graphics grfx = Graphics.FromImage(bitmap))
        {
            grfx.DrawImage(OriginalImage, 0, 0);

            grfx.DrawImage(ImageToAdd, OriginalImage.Width, 0);
        }

        return bitmap;
    }

Uasage is like this:

Image myNewCombinedImage = IconCombiner(Image.FromFile(@"YourPathToFile1"), Image.FromFile(@"YourPathToFile2")) ;
Leatherette answered 1/4, 2023 at 7:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.