2011-06-17 93 views
20

C# .Net kullanarak tek bir görüntüye neden olan iki farklı png/jpeg görüntüsünü birleştirmem gereken bir gereksinimim var. Kaynak görüntü üzerinde belirli bir yer olacak ve başka bir görüntü eklemem gerekiyor. Bazı bağlantılar önerebilir mi?C# ile tek bir görüntü oluşturmak için iki görüntüyü birleştirin. Net

+1

Aynı şeyleri arıyordum ve bunu buldum. http://stackoverflow.com/questions/465172/merging-two-images-in-c-net/465195#465195 – ddaaggeett

cevap

6

Yasal Uyarı: Ben Atalasoft

de

Bizim (ücretsiz) DotImage Photo SDK yapabilirsiniz çalışır.

Eğer CanvasCommand bakmak, farklı bir boyutta olması çıkan görüntü gerekirse başka

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

üst üste bindirmek için bir resim

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

açın. İhtiyacınız olan boyutta bir AtalaImage oluşturabilir ve ardından her bir görüntünün üzerine yerleştirebilirsiniz.

sizin ihtiyaçlarınız için karşılamak için kodu değiştirebilir Bu yöntem üst üste iki görüntüleri tek tek birleştirmek

botImage.Save("newImage.png", new PngEncoder(), null); 
+1

DotImage Photo SDK artık ücretsiz. :( –

+4

Bunun için üzgünüm - Daha fazla çalışmıyorum. Bu soruya verilen diğer cevaplar sizin için hala işe yaramalı. –

31

kaydetmek için:

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; 
    } 
+0

Neden Format32bppArgb? – Toolkit

+0

@Toolkit: Kurucu aşırı yükünü kullandığınızda hatırlıyorum. argümanlar sadece '(width, height)' 'Format24bppRgb' olan bir '24bit 'versiyonunu yaratacaktır ve bu yüzden bir tane içerdiği orijinal görüntülerin alfa kanalı bilgisini kaybedecektir, dolayısıyla Format32bppArgb' diye düşünün. Inline formatı yerine "Format32bppArgb" karakteri yerine orijinal görüntülerden uygun formatı alırsanız daha kullanışlı olur. –

10

Tüm bunların ardından, buldum bir yeni kolay yöntem bu deneyin ..

O birden fazla fotoğraf araya katılabilirsiniz:

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(); 
     } 
    } 
} 
+2

Awesome, kod için teşekkürler - ama asla "throw ex" - her zaman sadece "atmak". yığının sıfırlanması ve aksi halde hata ayıklamasının imkansız hale getirilmesi! – TheSoftwareJedi

+0

Bu kod bana, orijinalinden daha geniş olan çiftin son halini oluşturuyor (yükseklik kalıyor) –

+0

@PabloCost a Evet, yukarıdaki kodu görürseniz 'height = bitmap.Height> height? bitmap.Height: height; 'yeni oluşturulan görüntünün yüksekliği tüm resimlerin maksimum değeri olacaktır. –

5
 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(); 
+0

Yönteminizi izleyerek benzer bir şey denedim. Daha geniş bir genişlik ayarlıyorum ve görüntüleri çizdiğimde gri bir bölge görüntülenecektir. Bu bölgeyi tercihimin beyaz veya diğer düz renklerine nasıl değiştirebilirim? –