C # /। NET में दो छवियों को मर्ज करना


86

सरल विचार: मेरे पास दो छवियां हैं जिन्हें मैं विलय करना चाहता हूं, एक 500x500 है जो बीच में पारदर्शी है दूसरा 150x150 है।

मूल विचार यह है: एक खाली कैनवास बनाएं जो 500x500 है, 150x150 छवि को खाली कैनवास के बीच में रखें और फिर 500x500 छवि को कॉपी करें ताकि इसका पारदर्शी मध्य 150x150 को चमकने की अनुमति दे।

मुझे पता है कि यह जावा, पीएचपी और पायथन में कैसे किया जाता है ... मुझे अभी कोई पता नहीं है कि C # में उपयोग करने के लिए कौन सी वस्तुएं / कक्षाएं हैं, एक चित्र को दूसरे में कॉपी करने का एक त्वरित उदाहरण पर्याप्त होगा।


क्या यह मदद करता है? daniweb.com/forums/thread87993.html
Dror

जवाबों:


99

मूल रूप से मैं अपने एक ऐप में इसका उपयोग करता हूं: हम एक वीडियो के फ्रेम पर एक प्लेकॉन ओवरले करना चाहते हैं:

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
धन्यवाद! पूरी तरह से आज मेरे बेकन को बचाया
जेसन मोर

@downvoter विस्तृत करने के लिए देखभाल, ताकि मैं अपना उत्तर बढ़ा सकूं?
एंड्रियास नीडरमेयर

5
@AndreasNiedermair नीचे-मतदाता ने शायद आपके कोड को कॉपी किया और काम नहीं किया
जीन-पॉल

यह एक सोने का जवाब है जैसा कि यह है!
दिमित्रीबॉयको

60

यह एक छवि को दूसरे में जोड़ देगा।

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

ग्राफिक्स नामस्थान में है System.Drawing


33

इस सब के बाद, मुझे एक नया आसान तरीका मिला।

यह एक साथ कई फ़ोटो में शामिल हो सकता है:

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
बढ़िया काम किया। g.Clear (Color.Transparent) यदि आप एनीमेशन स्प्राइट के लिए PNG छवियों को मर्ज करना चाहते हैं
साइक्ले

1
FinalImage = new System.Drawing.Bitmap (चौड़ाई, ऊंचाई); चौड़ाई / ऊंचाई के उच्च मूल्यों के लिए त्रुटि फेंकता है
zeetit

@Anant Dabhi ठीक है, मुझे एक पुराना सवाल वापस लाने के लिए खेद है, लेकिन मैंने इसे VB.NET में बदल दिया है। अगर मैं अगली छवि पर अप्रयुक्त पिक्सेल / रिक्त पिक्सेल पारदर्शी है तो क्या मैं अन्य फ़ोटो को ओवरले कर दूंगा? यदि नहीं, तो क्या ऐसा करने का कोई तरीका है?
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.