convertire una stringa 64 base in un'immagine e salvarla


132

Ecco il mio codice:

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 dichiarazione in alto di imageUrl sta prendendo in una stringa di immagine Base64 e voglio convertirla in un'immagine. Penso che il mio set di codice funzioni solo per immagini come "www.mysite.com/test.jpg" e non per una stringa Base64. Qualcuno ha qualche suggerimento? Grazie!

Risposte:


219

Ecco un esempio, è possibile modificare il metodo per accettare un parametro stringa. Quindi salva l'oggetto immagine con 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;
}

È possibile ottenere un'eccezione A generic error occurred in GDI+.quando i byte rappresentano una bitmap. In questo caso, salvare l'immagine prima di disporre il flusso di memoria (mentre si è ancora all'interno dell'istruzione using).


Questo metodo mi dà un rettangolo nero, ne hai idea?
Katmanco,

54
Sì, questo è un pixel nero: R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw ==
CRice

6
@katmanco Penso che il pixel nero sia stato fornito come esempio. Prova a sostituire la stringa base64 di esempio con la tua stringa base64
kallotec

2
Potrebbe essere necessario aggiungere un riferimento a System.Drawing DLL
Philip Rego,

1
@Bibin hai provato a salvare l'immagine all'interno dell'istruzione using?
CRice,

83

È possibile salvare Base64 direttamente nel file:

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

Questa è un'eccellente soluzione nel mio caso in cui stavo usando mono su Linux e ho riscontrato un comportamento strano con gdi + in Image.Save. Questa soluzione bypassa completamente Immagine / GDI + (See stackoverflow.com/questions/35783690/... )
Jeff Albrecht

1
Ho provato sia questa che la soluzione di @ CRice (usando Image.Save()). Entrambi funzionano, ma per qualche ragione questa versione riduce le dimensioni del mio file del 30% in meno con nessun cambiamento visibile nella qualità dell'immagine
Brad Mathews

31

Ecco cosa ho finito con.

    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
Questo mi ha dato un errore A generic error occurred in GDI+descritto qui . Spostare l' image.Saveinterno del blocco usando lo ha riparato per me.
JumpingJezza,

11

Vorrei suggerire tramite 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");
        }
    }
}

2
qual è la differenza tra la conversione tramite bitmap o senza bitmap? grazie
Amine Da.

6

Nel mio caso funziona solo con due righe di codice. Prova il codice C # di seguito:

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

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

Questo è tutto. Si prega di votare se trovi davvero che questa soluzione funzioni per te. Grazie in anticipo.


1
E 'copia della mia risposta (vedi sotto stackoverflow.com/a/35160048/4190593 ) :)
INT_24h

-1 perché dirPathdeve avere un @segno prima della stringa i..e. @"C:\myfolder\"oppure devi sfuggire alle barre rovesciate nella stringa, ad es."C:\\myfolder\\"
Marcus Parsons,

dovresti fornire un riferimento a quell'altra risposta invece di prenderti tutto il merito ....
Arshi,

6

Ecco un codice funzionante per convertire un'immagine da una stringa base64 in un Imageoggetto e archiviarlo in una cartella con un nome file univoco:

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

In uno scenario simile ciò che ha funzionato per me è stato il seguente:

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

ImageTagId è l'ID del tag immagine ASP.


5

Se si dispone di una stringa di dati binari codificata Base64, si dovrebbe essere in grado di effettuare le seguenti operazioni:

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

Dovresti essere in grado di scrivere l'array risultante in un file.


Questo non funziona Converte semplicemente la stringa base64 nel suo equivalente binario. Scriverlo su un file con un'estensione di immagine non lo rende un'immagine.
elliotwesoff,

1
No? Mi dispiace, questo non è corretto . La conversione di una stringa Base64 nel suo equivalente binario non la rende un'immagine. (Grazie a @elliotwesoff per averlo segnalato!) E, perché stai citando i dati binari ? Questa domanda non menziona in alcun modo il binario , o anche come convertirlo.
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;
    }

}

2
Sebbene questo codice possa risolvere il problema del PO, è meglio includere una spiegazione su come il codice risolve il problema del PO. In questo modo, i futuri visitatori possono imparare dal tuo post e applicarlo al proprio codice. SO non è un servizio di codifica, ma una risorsa per la conoscenza. Inoltre, è più probabile che vengano votate risposte complete e di alta qualità. Queste caratteristiche, insieme alla necessità che tutti i post siano autonomi, sono alcuni dei punti di forza di SO come piattaforma, che lo differenzia dai forum. È possibile modificare per aggiungere ulteriori informazioni e / o integrare le proprie spiegazioni con la documentazione di origine.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.