web-dev-qa-db-fra.com

convertir une chaîne en base 64 en une image et la sauvegarder

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 une chaîne d'image en Base64 et je souhaite la convertir en image. Je pense que mon ensemble de code ne fonctionne que pour des images telles que "www.monsite.com/test.jpg" et non pour une chaîne Base64. Quelqu'un a des suggestions? Merci!

109
anthonypliu

Voici un exemple, vous pouvez modifier la méthode pour accepter un paramètre de chaîne. Ensuite, enregistrez l'objet image avec .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 dans l'instruction using).

183
CRice

Vous pouvez enregistrer Base64 directement dans un fichier:

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

Voici ce que j'ai fini par aller avec.

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

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");
        }
    }
}
8
Nishant Kumar

Dans mon cas, cela 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);

C'est ça. Merci de voter si vous trouvez que cette solution fonctionne pour vous. Merci d'avance.

7
Milan Sheth

Si vous avez une chaîne de données binaires codée en Base64, vous devriez pouvoir effectuer les opérations suivantes:

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

Vous devriez être capable d'écrire le tableau résultant dans un fichier.

6
afranz409

Dans un scénario similaire, ce qui a fonctionné pour moi a été le suivant:

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

ImageTagId est l'ID de la balise d'image ASP.

5
abhishek

Voici un code de travail permettant de convertir une image d'une chaîne base64 en un objet Image et de la stocker dans un dossier avec un nom de fichier unique:

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