mengonversi string base 64 ke gambar dan menyimpannya

132

Ini kode saya:

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

Decartion imageUrl atas mengambil dalam string gambar Base64, dan saya ingin mengubahnya menjadi gambar. Saya pikir set kode saya hanya berfungsi untuk gambar seperti "www.mysite.com/test.jpg" bukan untuk string Base64. Adakah yang punya saran? Terima kasih!

anthonypliu
sumber

Jawaban:

219

Berikut ini sebuah contoh, Anda dapat memodifikasi metode untuk menerima parameter string. Kemudian cukup simpan objek gambar dengan image.Save (...) .

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

Dimungkinkan untuk mendapatkan pengecualian A generic error occurred in GDI+.ketika byte merepresentasikan bitmap. Jika ini terjadi, simpan gambar sebelum membuang aliran memori (saat masih di dalam pernyataan menggunakan).

CRice
sumber
Metode ini memberi saya kotak hitam, apakah Anda punya ide?
katmanco
54
Ya ini adalah piksel hitam:
R0lGODlhAQABAIAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw
6
@katmanco Saya akan berpikir pixel hitam disediakan sebagai contoh. Coba ganti contoh string base64 dengan string base64 Anda sendiri
kallotec
2
Anda mungkin perlu menambahkan referensi ke System.Drawing DLL
Philip Rego
1
@Bibin apakah Anda mencoba menyimpan gambar di dalam pernyataan menggunakan?
CRice
83

Anda dapat menyimpan Base64 langsung ke file:

string filePath = "MyImage.jpg";
File.WriteAllBytes(filePath, Convert.FromBase64String(base64imageString));
INT_24j
sumber
Ini adalah solusi yang sangat baik dalam kasus saya di mana saya menggunakan mono di Linux dan mengalami beberapa perilaku aneh dengan gdi + di Image.Save. Solusi ini sepenuhnya mem-bypass Image / Gdi + (Lihat stackoverflow.com/questions/35783690/… )
Jeff Albrecht
1
Saya mencoba ini dan solusi @ CRice (menggunakan Image.Save()). Keduanya berfungsi, tetapi karena suatu alasan versi ini membuat ukuran file saya 30% lebih kecil tanpa perubahan kualitas gambar yang terlihat
Brad Mathews
31

Inilah yang akhirnya saya ikuti.

    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);
    }
Austin
sumber
7
Ini memberi saya kesalahan yang A generic error occurred in GDI+dijelaskan di sini . Memindahkan bagian image.Savedalam blok yang digunakan untuk saya.
JumpingJezza
11

Saya akan menyarankan melalui Bitmap:

public void SaveImage(string base64)
{
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64)))
    {
        using (Bitmap bm2 = new Bitmap(ms))
        {
            bm2.Save("SavingPath" + "ImageName.jpg");
        }
    }
}
Nishant Kumar
sumber
2
apa perbedaan antara mengkonversi melalui bitmap atau tanpa bitmap? thx
Amine Da.
6

Dalam kasus saya ini hanya berfungsi dengan dua baris kode. Uji kode C # di bawah ini:

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

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

Itu dia. Harap beri suara jika Anda benar-benar menemukan solusi ini cocok untuk Anda. Terima kasih sebelumnya.

Milan Sheth
sumber
1
Ini salinan jawaban saya (lihat di bawah stackoverflow.com/a/35160048/4190593 ) :)
INT_24h
-1 karena dirPathharus memiliki @tanda sebelum string i..e. @"C:\myfolder\"atau Anda harus melarikan diri dari garis miring terbalik dalam string yaitu"C:\\myfolder\\"
Marcus Parsons
Anda harus memberikan referensi ke jawaban lain itu alih-alih mengambil seluruh kredit ....
Arshi
6

Berikut adalah kode yang berfungsi untuk mengonversi gambar dari string base64 ke Imageobjek dan menyimpannya di folder dengan nama file unik:

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();
    }
}
Yogesh Bhokare
sumber
5

Dalam skenario yang sama, apa yang berhasil bagi saya adalah sebagai berikut:

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

ImageTagId adalah ID dari tag gambar ASP.

abhishek
sumber
5

Jika Anda memiliki serangkaian data biner yang disandikan Base64, Anda harus bisa melakukan hal berikut:

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

Anda harus dapat menulis array yang dihasilkan ke file.

afranz409
sumber
Ini tidak berhasil. Itu hanya mengkonversi string base64 ke setara biner. Menulis itu ke file dengan ekstensi gambar tidak membuatnya menjadi gambar.
elliotwesoff
1
Tidak? Maaf, ini tidak benar . Mengubah string Base64 ke padanan binernya tidak membuatnya menjadi gambar. (Terima kasih @elliotwesoff untuk menunjukkan hal itu!) Dan, mengapa Anda menyebutkan data biner ? Pertanyaan ini sama sekali tidak menyebutkan biner , atau bahkan bagaimana mengubahnya.
Momoro
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;
    }

}
MOHD KHALID
sumber
2
Meskipun kode ini dapat menyelesaikan masalah OP, yang terbaik adalah menyertakan penjelasan tentang bagaimana kode Anda mengatasi masalah OP. Dengan cara ini, pengunjung masa depan dapat belajar dari pos Anda, dan menerapkannya pada kode mereka sendiri. SO bukan layanan pengkodean, tetapi sumber daya untuk pengetahuan. Juga, kualitas tinggi, jawaban lengkap lebih cenderung terunggulkan. Fitur-fitur ini, bersama dengan persyaratan bahwa semua posting mandiri, adalah beberapa kekuatan SO sebagai platform, yang membedakannya dari forum. Anda dapat mengedit untuk menambahkan info tambahan & / atau untuk melengkapi penjelasan Anda dengan dokumentasi sumber.
ysf