165 votes

convertir une chaîne de base 64 en une image et l'enregistrer

Voici mon code :

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

La déclaration top imageUrl prend dans une chaîne d'image Base64, et je veux la convertir en image. Je pense que mon ensemble de code ne fonctionne que pour des images comme "www.mysite.com/test.jpg" et non pour une chaîne Base64. Quelqu'un a des suggestions ? Merci !

270voto

CRice Points 4717

Voici un exemple, vous pouvez modifier la méthode pour accepter un paramètre de chaîne. Puis il suffit d'enregistrer l'objet image avec 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;
}

Il est possible d'obtenir une exception A generic error occurred in GDI+. lorsque les octets représentent un bitmap. Si cela se produit, enregistrez l'image avant de disposer du flux de mémoire (tout en restant à l'intérieur de l'instruction using).

113voto

INT_24h Points 1273

Vous pouvez enregistrer Base64 directement dans le fichier :

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

36voto

Austin Points 71

Voici ce que j'ai fini par faire.

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

14voto

Nishant Points 1605

Je suggérerais via 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");
        }
    }
}

8voto

Milan Sheth Points 21

Dans mon cas, il ne fonctionne qu'avec deux lignes de code. Testez le code C# ci-dessous :

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

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

Merci de voter si vous trouvez vraiment que cette solution fonctionne pour vous. Merci d'avance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X