Hợp nhất hai hình ảnh trong C # /. NET


86

Ý tưởng đơn giản: Tôi có hai hình ảnh mà tôi muốn hợp nhất, một hình có kích thước 500x500 trong suốt ở giữa, hình còn lại là 150x150.

Ý tưởng cơ bản là: Tạo một canvas trống có kích thước 500x500, đặt hình ảnh 150x150 ở giữa canvas trống và sau đó sao chép hình ảnh 500x500 lên trên để phần giữa trong suốt của nó cho phép 150x150 chiếu qua.

Tôi biết cách làm điều đó bằng Java, PHP và Python ... Tôi chỉ không biết đối tượng / lớp nào sẽ sử dụng trong C #, một ví dụ nhanh về việc sao chép một hình ảnh sang một hình ảnh khác là đủ.


Không giúp đỡ à? daniweb.com/forums/thread87993.html
Dror

Câu trả lời:


99

về cơ bản tôi sử dụng điều này trong một trong các ứng dụng của chúng tôi: chúng tôi muốn phủ một playicon lên một khung của 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) { }
    }
}

10
CẢM ƠN! Hoàn toàn tiết kiệm được thịt xông khói của tôi hôm nay
Jason More

@downvoter quan tâm giải thích để tôi có thể nâng cao câu trả lời của mình?
Andreas Niedermair

5
@AndreasNiedermair xuống-cử tri có thể copy dán mã của bạn và không làm việc
Jean-Paul

Đó là một câu trả lời vàng như nó là!
DmitryBoyko

60

Điều này sẽ thêm một hình ảnh vào một hình ảnh khác.

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

Đồ họa nằm trong không gian tên System.Drawing


33

Sau tất cả những điều này, tôi đã tìm thấy một phương pháp mới dễ dàng hơn, hãy thử cách này ..

Nó có thể nối nhiều ảnh lại với nhau:

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

4
hoạt động tốt. g.Clear (Color.Transparent) nếu bạn muốn kết hợp các hình ảnh PNG cho sprites hoạt hình
syclee

1
finalImage = new System.Drawing.Bitmap (chiều rộng, chiều cao); throws lỗi cho các giá trị cao của chiều rộng / chiều cao
zeetit

@Anant Dabhi Được rồi, tôi rất tiếc phải nhắc lại một câu hỏi cũ, nhưng tôi đã chuyển đổi câu hỏi này thành VB.NET .. Liệu điều này có phủ lên các ảnh khác nếu tôi đặt chúng lên nhau nếu các pixel / pixel trống không sử dụng trên hình ảnh tiếp theo là trong suốt không? Nếu không, có cách nào để làm điều đó?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.