web-dev-qa-db-fra.com

Fusionner deux images pour créer une seule image dans C # .Net

J'ai une exigence selon laquelle j'ai besoin de fusionner deux images png/jpeg différentes résultant en une seule image utilisant C # .Net. Il y aura un emplacement particulier défini sur l'image source dans lequel je dois insérer une autre image. Quelqu'un peut-il suggérer des liens?

22
Anil C

Cette méthode fusionne deux images l'une en haut de l'autre, vous pouvez modifier le code pour répondre à vos besoins:

    public static Bitmap MergeTwoImages(Image firstImage, Image secondImage)
    {
        if (firstImage == null)
        {
            throw new ArgumentNullException("firstImage");
        }

        if (secondImage == null)
        {
            throw new ArgumentNullException("secondImage");
        }

        int outputImageWidth = firstImage.Width > secondImage.Width ? firstImage.Width : secondImage.Width;

        int outputImageHeight = firstImage.Height + secondImage.Height + 1;

        Bitmap outputImage = new Bitmap(outputImageWidth, outputImageHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        using (Graphics graphics = Graphics.FromImage(outputImage))
        {
            graphics.DrawImage(firstImage, new Rectangle(new Point(), firstImage.Size),
                new Rectangle(new Point(), firstImage.Size), GraphicsUnit.Pixel);
            graphics.DrawImage(secondImage, new Rectangle(new Point(0, firstImage.Height + 1), secondImage.Size),
                new Rectangle(new Point(), secondImage.Size), GraphicsUnit.Pixel);
        }

        return outputImage;
    }
34
Jalal Said

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)
    {
        if (finalImage != null)
            finalImage.Dispose();
        //throw ex;
        throw;
    }
    finally
    {
        //clean up memory
        foreach (System.Drawing.Bitmap image in images)
        {
            image.Dispose();
        }
    }
}
12
Anant Dabhi

Disclaimer: Je travaille chez Atalasoft

Notre DotImage Photo SDK (qui est gratuit) peut le faire.

Ouvrir une image

 AtalaImage botImage = new AtalaImage("bottomImage.png");
 AtalaImage topImage = new AtalaImage("topImage.png");

Pour superposer les uns sur les autres

 Point pos = new Point(0,0); // or whatever you need
 OverlayCommand cmd = new OverlayCommand(topImage, pos);
 ImageResults res = cmd.Apply(botImage);

Si vous souhaitez que l’image obtenue ait une taille différente, examinez la variable CanvasCommand. Vous pouvez également créer une image AtalaImage de la taille dont vous avez besoin, puis superposer chaque image dessus.

Sauver

 botImage.Save("newImage.png", new PngEncoder(), null);
7
Lou Franco
        String jpg1 = @"c:\images.jpeg";
        String jpg2 = @"c:\images2.jpeg";
        String jpg3 = @"c:\image3.jpg";

        Image img1 = Image.FromFile(jpg1);
        Image img2 = Image.FromFile(jpg2);

        int width = img1.Width + img2.Width;
        int height = Math.Max(img1.Height, img2.Height);

        Bitmap img3 = new Bitmap(width, height);
        Graphics g = Graphics.FromImage(img3);

        g.Clear(Color.Black);
        g.DrawImage(img1, new Point(0, 0));
        g.DrawImage(img2, new Point(img1.Width, 0));

        g.Dispose();
        img1.Dispose();
        img2.Dispose();

        img3.Save(jpg3, System.Drawing.Imaging.ImageFormat.Jpeg);
        img3.Dispose();
5
Deepak Sharma
private void Merge _Click(object sender, EventArgs e)
{
}
DirectoryInfo directory=new DirectoryInfo("D:\\Images");
if(directory!=null)
{
    FileInfo[]files = directory.GetFiles();
    MergeImages(Image);
}

private void MergeImages(FileInfo[] Image)
{
    //change the location to store the final image.
    string FImage= @"D:\\Images\\FImage.jpg";
    List imageHeights = new List();
    int nIndex = 0;
    int width = 0;
    foreach (FileInfo file in files)
    {
        Image img = Image.FromFile(file.FullName);
        imageHeights.Add(img.Height);
        width += img.Width;
        img.Dispose();
    }
    imageHeights.Sort();
    int height = imageHeights[imageHeights.Count - 1];
    Bitmap NewImg = new Bitmap(width, height);
    Graphics Gr= Graphics.FromImage(NewImg);
    Gr.Clear(SystemColors.AppWorkspace);
    foreach (FileInfo file in files)
    {
        Image img = Image.FromFile(file.FullName);
        if (nIndex == 0)
        {
            Gr.DrawImage(img, new Point(0, 0));
            nIndex++;
            width = img.Width;
        }
        else
        {
            Gr.DrawImage(img, new Point(width, 0));
            width += img.Width;
        }
            img.Dispose();
    }
    Gr.Dispose();
    NewImg .Save(FImage, System.Drawing.Imaging.ImageFormat.Jpeg);
    NewImg .Dispose();
    imageLocation.Image = Image.FromFile(FImage);
}
0
JIYAUL MUSTAPHA

J'ai api pour cela à http://bookingbillboard.com/API . Cette api combinera 2 images. Une image est votre image/conception/affiche, et une autre image est une photo de panneau d'affichage. en utilisant l'API, vous pouvez voir à quoi ressemble votre conception/images/affiche sur la photo d'un panneau d'affichage

0
Kukuh Tw