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
cevap
Yasal Uyarı: Ben Atalasoft
deBizim (ücretsiz) DotImage Photo SDK yapabilirsiniz çalışır.
EğerCanvasCommand
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);
DotImage Photo SDK artık ücretsiz. :( –
Bunun için üzgünüm - Daha fazla çalışmıyorum. Bu soruya verilen diğer cevaplar sizin için hala işe yaramalı. –
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;
}
Neden Format32bppArgb? – Toolkit
@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. –
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();
}
}
}
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
Bu kod bana, orijinalinden daha geniş olan çiftin son halini oluşturuyor (yükseklik kalıyor) –
@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. –
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();
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? –
Aynı şeyleri arıyordum ve bunu buldum. http://stackoverflow.com/questions/465172/merging-two-images-in-c-net/465195#465195 – ddaaggeett