Menggabungkan dua gambar di C # /. NET

87

Ide sederhana: Saya memiliki dua gambar yang ingin saya gabungkan, satu adalah 500x500 yang transparan di tengah, yang lainnya adalah 150x150.

Ide dasarnya adalah: Buat kanvas kosong berukuran 500x500, posisikan gambar 150x150 di tengah kanvas kosong lalu salin gambar 500x500 sehingga bagian tengah transparannya memungkinkan 150x150 bersinar.

Saya tahu bagaimana melakukannya di Java, PHP dan Python ... Saya hanya tidak tahu objek / kelas apa yang akan digunakan di C #, contoh cepat menyalin gambar ke gambar lain sudah cukup.

thr
sumber
Apakah ini membantu? daniweb.com/forums/thread87993.html
Dror

Jawaban:

99

pada dasarnya saya menggunakan ini di salah satu aplikasi kami: kami ingin menampilkan ikon permainan di atas bingkai 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) { }
    }
}
Andreas Niedermair
sumber
10
TERIMA KASIH! Benar-benar menyelamatkan daging saya hari ini
Jason More
@downvoter care untuk menjelaskan, sehingga saya dapat meningkatkan jawaban saya?
Andreas Niedermair
5
@AndreasNiedermair pemilih yang down mungkin menyalin kode Anda dan tidak berfungsi
Jean-Paul
Ini adalah jawaban emas apa adanya!
DmitryBoyko
60

Ini akan menambah gambar ke yang lain.

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

Grafik ada di namespace System.Drawing

Dustin Brooks
sumber
35

Setelah semua ini, saya menemukan metode baru yang lebih mudah coba ini ..

Itu dapat menggabungkan beberapa foto bersama:

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();
        }
    }
}
Anant Dabhi
sumber
5
bekerja dengan baik. g.Clear (Color.Transparent) jika Anda ingin menggabungkan gambar PNG untuk sprite animasi
syclee
1
finalImage = new System.Drawing.Bitmap (lebar, tinggi); melempar kesalahan untuk nilai tinggi lebar / tinggi
zeetit
@Anant Dabhi Oke, saya minta maaf untuk mengembalikan pertanyaan lama, tapi saya mengubahnya menjadi VB.NET .. Apakah ini akan melapisi foto lain jika saya menempatkannya di atas satu sama lain jika piksel yang tidak digunakan / piksel kosong pada gambar berikutnya transparan? Jika tidak, apakah ada cara untuk melakukannya?