एक बेस 64 स्ट्रिंग को एक छवि में परिवर्तित करना और इसे सहेजना


132

यहाँ मेरा कोड है:

protected void SaveMyImage_Click(object sender, EventArgs e)
        {
            string imageUrl = Hidden1.Value;
            string saveLocation = Server.MapPath("~/PictureUploads/whatever2.png") ; 


            HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(imageUrl);
            WebResponse imageResponse = imageRequest.GetResponse();

            Stream responseStream = imageResponse.GetResponseStream();

            using (BinaryReader br = new BinaryReader(responseStream))
            {
                imageBytes = br.ReadBytes(500000);
                br.Close();
            }
            responseStream.Close();
            imageResponse.Close();

            FileStream fs = new FileStream(saveLocation, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            try
            {
                bw.Write(imageBytes);
            }
            finally
            {
                fs.Close();
                bw.Close();
            }
        }
}

शीर्ष छविआयु घोषणा एक बेस 64 छवि स्ट्रिंग में ले जा रही है, और मैं इसे एक छवि में बदलना चाहता हूं। मुझे लगता है कि मेरा कोड केवल "www.mysite.com/test.jpg" जैसी छवियों के लिए काम करता है, बेस 64 स्ट्रिंग के लिए नहीं। किसी के पास कुछ सुझाव हैं? धन्यवाद!

जवाबों:


218

यहाँ एक उदाहरण है, आप एक स्ट्रिंग पैरामीटर को स्वीकार करने के लिए विधि को संशोधित कर सकते हैं। इसके बाद इमेज के साथ सिर्फ इमेज ऑब्जेक्ट को सेव करें। सेव (...)

public Image LoadImage()
{
    //data:image/gif;base64,
    //this image is a single pixel (black)
    byte[] bytes = Convert.FromBase64String("R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw==");

    Image image;
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        image = Image.FromStream(ms);
    }

    return image;
}

A generic error occurred in GDI+.जब बाइट्स बिटमैप का प्रतिनिधित्व करते हैं तो अपवाद प्राप्त करना संभव है । यदि यह मेमोरी स्ट्रीम को निपटाने से पहले छवि को बचा रहा है (जबकि उपयोग स्टेटमेंट के अंदर अभी भी)।


यह विधि मुझे काले आयत देती है, क्या आपको कोई विचार है?
कतमाँको

54
हाँ, यह एक काला पिक्सेल है: R0lGODlhAQABAIAAAAAAAAAAAAACH5BAAAAAAAAALAAAAAABAAEAAAAATATAEAOw ==
CRice

6
@katmanco मुझे लगता है कि ब्लैक पिक्सेल एक उदाहरण के रूप में प्रदान किया गया था। उदाहरण बेस 64 स्ट्रिंग को अपने बेस 64 स्ट्रिंग के साथ बदलने की कोशिश करें
kallotec

2
आपको System.Drawing DLL
Philip Rego

1
@Bibin क्या आपने स्टेटमेंट का उपयोग करके छवि को बचाने की कोशिश की?
CRice

83

आप बेस 64 को सीधे फाइल में सेव कर सकते हैं:

string filePath = "MyImage.jpg";
File.WriteAllBytes(filePath, Convert.FromBase64String(base64imageString));

यह मेरे मामले में एक उत्कृष्ट समाधान है, जहां मैं लिनक्स पर मोनो का उपयोग कर रहा था और जीडी + के साथ कुछ अजीब व्यवहार का अनुभव किया था। यह समाधान पूरी तरह से छवि / Gdi + को देखता है (देखें stackoverflow.com/questions/35783690/… )
Jeff Albrecht

1
मैंने यह और @ CRice का समाधान (उपयोग Image.Save()) दोनों की कोशिश की । दोनों काम करते हैं, लेकिन किसी कारण से यह संस्करण मेरी फ़ाइल का आकार 30% छोटा कर देता है, जिसकी छवि गुणवत्ता में कोई परिवर्तन नहीं हुआ है
ब्रैड मैथ्यूज

31

यहाँ है क्या मैं के साथ जा रहा समाप्त हो गया।

    private void SaveByteArrayAsImage(string fullOutputPath, string base64String)
    {
        byte[] bytes = Convert.FromBase64String(base64String);

        Image image;
        using (MemoryStream ms = new MemoryStream(bytes))
        {
            image = Image.FromStream(ms);
        }

        image.Save(fullOutputPath, System.Drawing.Imaging.ImageFormat.Png);
    }

7
इससे मुझे यहाँA generic error occurred in GDI+ वर्णित त्रुटि मिली । प्रयोग ब्लॉक के अंदर ले जाना मेरे लिए इसे तय किया। image.Save
जंपिंगजेजा

11

मैं बिटमैप के माध्यम से सुझाव दूंगा:

public void SaveImage(string base64)
{
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64)))
    {
        using (Bitmap bm2 = new Bitmap(ms))
        {
            bm2.Save("SavingPath" + "ImageName.jpg");
        }
    }
}

2
बिटमैप के माध्यम से या बिटमैप के बिना परिवर्तित करने के बीच क्या अंतर है? thx
अमीन दा।

6

मेरे मामले में यह केवल दो लाइन कोड के साथ काम करता है। नीचे C # कोड का परीक्षण करें:

String dirPath = "C:\myfolder\";
String imgName = "my_mage_name.bmp";

byte[] imgByteArray = Convert.FromBase64String("your_base64_string");
File.WriteAllBytes(dirPath + imgName, imgByteArray);

बस। कृपया वोट करें यदि आप वास्तव में यह समाधान आपके लिए काम करते हैं। अग्रिम में धन्यवाद।


1
यह मेरे उत्तर की प्रति है (नीचे देखें stackoverflow.com/a/35160048/4190593 ) :)
INT_24h

-1 क्योंकि स्ट्रिंग से पहले dirPathएक @चिन्ह होना चाहिए I..e। @"C:\myfolder\"या आपको स्ट्रिंग में बैकस्लैश से बचना होगा"C:\\myfolder\\"
मार्कस पार्सन्स

आपको संपूर्ण क्रेडिट लेने के बजाय उस अन्य उत्तर का संदर्भ प्रदान करना चाहिए ....
अर्शी

6

यहाँ किसी बेस 64 स्ट्रिंग से किसी Imageवस्तु में एक छवि बदलने और इसे एक फ़ोल्डर में संग्रहित करने के लिए काम कर रहा है कोड :

public void SaveImage()
{
    string strm = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; 

    //this is a simple white background image
    var myfilename= string.Format(@"{0}", Guid.NewGuid());

    //Generate unique filename
    string filepath= "~/UserImages/" + myfilename+ ".jpeg";
    var bytess = Convert.FromBase64String(strm);
    using (var imageFile = new FileStream(filepath, FileMode.Create))
    {
        imageFile.Write(bytess, 0, bytess.Length);
        imageFile.Flush();
    }
}

5

इसी तरह के परिदृश्य में मेरे लिए काम करना निम्नलिखित था:

byte[] bytes = Convert.FromBase64String(Base64String);    
ImageTagId.ImageUrl = "data:image/jpeg;base64," + Convert.ToBase64String(bytes);

ImageTagId एएसपी छवि टैग की आईडी है।


5

यदि आपके पास बाइनरी डेटा का एक स्ट्रिंग है जो कि बेस 64 एनकोडेड है, तो आपको निम्न कार्य करने में सक्षम होना चाहिए:

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);

आपको फ़ाइल में परिणामी सरणी लिखने में सक्षम होना चाहिए।


यह काम नहीं करता है। यह बस आधार 64 स्ट्रिंग को अपने बाइनरी समतुल्य में परिवर्तित करता है। एक छवि विस्तार के साथ एक फ़ाइल में लिखना यह एक छवि नहीं बनाता है।
elliotwesoff

1
नहीं? मुझे क्षमा करें, यह गलत है । Base64 स्ट्रिंग को इसके बाइनरी समतुल्य में बदलने से यह एक छवि नहीं बनती है। (धन्यवाद @elliotwesoff कि इशारा करते हुए!) और, आप बाइनरी डेटा का उल्लेख क्यों कर रहे हैं ? यह सवाल किसी भी तरह से बाइनरी का उल्लेख नहीं करता है , या यहां तक ​​कि इसे कैसे परिवर्तित किया जाए।
मोमोरो

0
public bool SaveBase64(string Dir, string FileName, string FileType, string Base64ImageString)
{
    try
    {
        string folder = System.Web.HttpContext.Current.Server.MapPath("~/") + Dir;
        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }

        string filePath = folder + "/" + FileName + "." + FileType;
        File.WriteAllBytes(filePath, Convert.FromBase64String(Base64ImageString));
        return true;
    }
    catch
    {
        return false;
    }

}

2
हालांकि यह कोड ओपी के मुद्दे को हल कर सकता है, लेकिन स्पष्टीकरण को शामिल करना सबसे अच्छा है कि आपका कोड ओपी के मुद्दे को कैसे संबोधित करता है। इस तरह, भविष्य के आगंतुक आपके पोस्ट से सीख सकते हैं, और इसे अपने स्वयं के कोड पर लागू कर सकते हैं। SO एक कोडिंग सेवा नहीं है, बल्कि ज्ञान के लिए एक संसाधन है। इसके अलावा, उच्च गुणवत्ता, पूर्ण उत्तरों के अपग्रेड होने की अधिक संभावना है। ये विशेषताएं, इस आवश्यकता के साथ कि सभी पद स्व-सम्‍मिलित हैं, एसओ की कुछ ताकतें एक मंच के रूप में हैं, जो इसे मंचों से अलग करती हैं। आप अतिरिक्त जानकारी जोड़ने और / या स्रोत प्रलेखन के साथ अपने स्पष्टीकरण के पूरक के लिए संपादित कर सकते हैं।
ysf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.