C # /. NET'te iki görüntüyü birleştirme


87

Basit fikir: Birleştirmek istediğim iki resmim var, biri 500x500, diğeri ise 150x150.

Temel fikir şudur: 500x500 boyutunda boş bir tuval oluşturun, 150x150 resmi boş tuvalin ortasına yerleştirin ve ardından 500x500 resmi üzerine kopyalayın, böylece şeffaf ortası 150x150 boyutunun parlamasına izin verir.

Java, PHP ve Python'da nasıl yapılacağını biliyorum ... C # 'da hangi nesnelerin / sınıfların kullanılacağı hakkında hiçbir fikrim yok, bir görüntüyü diğerine kopyalamanın hızlı bir örneği yeterli olacaktır.


Bu yardımcı olur mu? daniweb.com/forums/thread87993.html
Dror

Yanıtlar:


99

temelde bunu uygulamalarımızdan birinde kullanıyorum: bir video karesinin üzerine bir oynatma simgesi yerleştirmek istiyoruz:

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) { }
    }
}

10
TEŞEKKÜRLER! Bugün pastırmamı tamamen kurtardım
Jason More

@downvoter, cevabımı geliştirebilmem için detaylandırmaya özen gösteriyor mu?
Andreas Niedermair

5
Aşağı oy veren @AndreasNiedermair muhtemelen kodunuzu kopyaladı ve işe yaramadı
Jean-Paul

Olduğu gibi altın bir cevap!
DmitryBoyko

60

Bu, diğerine bir görüntü ekleyecektir.

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

Grafikler ad alanında System.Drawing


35

Tüm bunlardan sonra, yeni ve daha kolay bir yöntem buldum bunu deneyin ..

Birden fazla fotoğrafı bir araya getirebilir:

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

5
harika çalıştı. g.Clear (Color.Transparent), animasyon sprite için PNG resimlerini birleştirmek istiyorsanız
12'de

1
finalImage = new System.Drawing.Bitmap (genişlik, yükseklik); yüksek genişlik / yükseklik değerleri için hata atıyor
zeetit

@Anant Dabhi Tamam, eski bir soruyu geri getirdiğim için özür dilerim, ancak bunu VB.NET'e çevirdim .. Bir sonraki görüntüdeki kullanılmayan pikseller / boş pikseller şeffafsa, bunları birbirlerinin üzerine yerleştirirsem bu diğer fotoğrafları kaplayacak mı? Değilse, bunu yapmanın bir yolu var mı?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.