একটি বেস 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.64 স্ট্রিংয়ের জন্য নয় "www.mysite.com/test.jpg" এর মতো চিত্রগুলির জন্য কাজ করে। কারও কিছু পরামর্শ আছে? ধন্যবাদ!

উত্তর:


218

এখানে একটি উদাহরণ রয়েছে, আপনি স্ট্রিং প্যারামিটার গ্রহণ করার পদ্ধতিটি পরিবর্তন করতে পারেন। তারপরে কেবল চিত্রের সাহায্যে চিত্রের অবজেক্টটি সংরক্ষণ করুন Sসেভ (...)

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+.যখন বাইটস বিটম্যাপ উপস্থাপন করে তখন একটি ব্যতিক্রম পাওয়া সম্ভব । যদি এটি হয়ে থাকে তবে মেমরি স্ট্রিমটি নিষ্পত্তি করার আগে চিত্রটি সংরক্ষণ করুন (এখনও ব্যবহারের বিবৃতিতে থাকা অবস্থায়)।


এই পদ্ধতিটি আমাকে কালো আয়তক্ষেত্র দেয়, আপনার কোনও ধারণা আছে?
katmanco

54
হ্যাঁ এটি একটি কালো পিক্সেল: R0lGODlhAQABAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAICTAEAOw ==
ক্রিস

6
@ ক্যাটম্যানকো আমি মনে করব যে কালো পিক্সেল একটি উদাহরণ হিসাবে সরবরাহ করা হয়েছিল। উদাহরণ বেস
বেসটি

2
আপনাকে সিস্টেমে একটি রেফারেন্স যুক্ত করতে হতে পারে D ড্রয়িং ডিএলএল
ফিলিপ রেগো

1
@ বিবিন আপনি কি ব্যবহারের বিবৃতিতে চিত্রটি সংরক্ষণ করার চেষ্টা করেছিলেন?
ক্রিস

83

আপনি বেস 64 সরাসরি ফাইলের মধ্যে সংরক্ষণ করতে পারেন:

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

এটি আমার ক্ষেত্রে একটি দুর্দান্ত সমাধান যেখানে আমি লিনাক্সে মনো ব্যবহার করছিলাম এবং ইমেজ.সেভে gdi + এর সাথে কিছু অদ্ভুত আচরণের অভিজ্ঞতা পেয়েছি। এই সমাধান সম্পূর্ণরূপে image / GDI + + (দেখুন রোধ করা যাবে stackoverflow.com/questions/35783690/... )
জেফ আলব্রেশট

1
আমি এই এবং @ ক্রাইস এর সমাধান (ব্যবহার করে 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

আমার ক্ষেত্রে এটি কোডের দুটি লাইনের সাথেই কাজ করে। নীচের সি # কোডটি পরীক্ষা করুন:

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 কারণ স্ট্রিং i..e এর আগে dirPathএকটি @চিহ্ন থাকতে হবে। @"C:\myfolder\"অথবা আপনাকে স্ট্রিংয়ে ব্যাকস্ল্যাশগুলি এড়িয়ে যেতে হবে"C:\\myfolder\\"
মার্কস পার্সসন

পুরো credit

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
কোন? আমি দুঃখিত, এটি ভুল । একটি বেস 64 স্ট্রিংটিকে তার বাইনারি সমতুল্যে রূপান্তর করা এটি কোনও চিত্র তৈরি করে না। (এটি নির্দেশ করার জন্য @ এলিওটওয়েসফ ধন্যবাদ!) এবং, আপনি বাইনারি ডেটা উল্লেখ করছেন কেন ? এই প্রশ্নটি কোনওভাবেই বাইনারি বা কীভাবে এটি রূপান্তর করবেন তা উল্লেখ করে না।
মোমোরো

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
এই কোডটি ওপির সমস্যার সমাধান করতে পারে তবে আপনার কোডটি কীভাবে ওপি'র সমস্যাটিকে সম্বোধন করে সে সম্পর্কে একটি ব্যাখ্যা অন্তর্ভুক্ত করা ভাল। এইভাবে, ভবিষ্যতের দর্শনার্থীরা আপনার পোস্ট থেকে শিখতে এবং তাদের নিজস্ব কোডে এটি প্রয়োগ করতে পারে। এসও কোনও কোডিং পরিষেবা নয়, তবে জ্ঞানের সংস্থান। এছাড়াও, উচ্চ মানের, সম্পূর্ণ উত্তরগুলি আপলোড হওয়ার সম্ভাবনা বেশি। এই বৈশিষ্ট্যগুলি সহ সমস্ত পোস্ট স্বাবলম্বিত হওয়া প্রয়োজনীয়তার সাথে একটি প্ল্যাটফর্ম হিসাবে এসও এর কিছু শক্তি যা এটি ফোরামে পৃথক করে। আপনি অতিরিক্ত তথ্য যোগ করতে এবং / অথবা উত্স নথির সাথে আপনার ব্যাখ্যা পরিপূরক করতে সম্পাদনা করতে পারেন।
ysf
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.