Converte un'immagine (selezionata dal percorso) in una stringa base64


111

Come si converte un'immagine da un percorso sul computer dell'utente a una stringa base64 in C #?

Ad esempio, ho il percorso dell'immagine (nel formato C:/image/1.gif) e vorrei avere un URI di dati simile a data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..rappresentare l' 1.gifimmagine restituita.


Se hai intenzione di incorporarli in CSS, pensa alla configurazione di un sistema buil come Gulp.js che può gestire questa attività per te
Konstantin Tarkus

2
Vuoi che la stringa del percorso sia codificata o l'immagine in quel punto, fornendo un URI di dati?
Marcel

Risposte:


192

Prova questo

using (Image image = Image.FromFile(Path))
{
    using (MemoryStream m = new MemoryStream())
    {
        image.Save(m, image.RawFormat);
        byte[] imageBytes = m.ToArray();

        // Convert byte[] to Base64 String
        string base64String = Convert.ToBase64String(imageBytes);
        return base64String;
    }
}

5
Perché anche preoccuparsi di salvarlo di nuovo? puoi semplicemente leggere i byte del file e convertirli.
Nyerguds

1
Nel mio caso era perché volevo ridimensionare l'immagine dopo che è stata caricata.
pgee70

@Nyerguds penso che sia perché deve essere in formato grezzo a giudicare dal image.RawFormat.
facepalm42

2
@ facepalm42 RawFormatnon è un identificatore di formato immagine; è una proprietà imagedell'oggetto, che restituisce il formato in cui si trovava l'immagine quando è stata letta dal file , il che significa che in questo caso restituirà il formato gif. Quindi non cambia nulla, tranne che invece dei byte del file originale effettivo, hai i byte dell'immagine come ri-salvati in gif dal framework .Net.
Nyerguds

Nota che per qualche motivo .Net non vede le gif animate che carica come immagini in tavolozza (accade solo su gif animate, anche se accade anche con alcuni tipi di png ), e quando si salva di nuovo dette immagini "ad alto colore" in formato tavolozza , utilizza una tavolozza di colori standard di Windows a 256 colori. Poiché le gif animate di solito hanno una tavolozza ottimizzata, ciò significa che qualsiasi gif animata salvata attraverso questo processo avrà la sua qualità orribilmente degradata. Quindi questa configurazione non è sicuramente l'ideale; è molto meglio leggere solo i byte originali, come mostra la risposta di KansaiRobot.
Nyerguds

105

Ottieni la byte[]rappresentazione della matrice di byte ( ) dell'immagine, quindi usa Convert.ToBase64String(), st. come questo:

byte[] imageArray = System.IO.File.ReadAllBytes(@"image file path");
string base64ImageRepresentation = Convert.ToBase64String(imageArray);

Per riconvertire un'immagine base4 in System.Drawing.Image:

var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));

3
@ Smith, se intendi riconvertire da base64 a System.Drawing.Imagepuoi usare st. in questo modo:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian

27

Poiché alla maggior parte di noi piacciono gli oneliner:

Convert.ToBase64String(File.ReadAllBytes(imageFilepath));

Se ne hai bisogno come array di byte Base64:

Encoding.ASCII.GetBytes(Convert.ToBase64String(File.ReadAllBytes(imageFilepath)));

22

Sebbene la risposta più complicata sia ok, trovo che sia molto meglio

var base64String= Convert.ToBase64String(File.ReadAllBytes(pathOfPic));

È semplice, non è necessario salvare nuovamente e gestisce diversi formati


1
In che modo è diverso dalla risposta di Ogglas di un anno prima?
ruffin

8

Questa è la classe che ho scritto per questo scopo:

public class Base64Image
{
    public static Base64Image Parse(string base64Content)
    {
        if (string.IsNullOrEmpty(base64Content))
        {
            throw new ArgumentNullException(nameof(base64Content));
        }

        int indexOfSemiColon = base64Content.IndexOf(";", StringComparison.OrdinalIgnoreCase);

        string dataLabel = base64Content.Substring(0, indexOfSemiColon);

        string contentType = dataLabel.Split(':').Last();

        var startIndex = base64Content.IndexOf("base64,", StringComparison.OrdinalIgnoreCase) + 7;

        var fileContents = base64Content.Substring(startIndex);

        var bytes = Convert.FromBase64String(fileContents);

        return new Base64Image
        {
            ContentType = contentType,
            FileContents = bytes
        };
    }

    public string ContentType { get; set; }

    public byte[] FileContents { get; set; }

    public override string ToString()
    {
        return $"data:{ContentType};base64,{Convert.ToBase64String(FileContents)}";
    }
}

var base64Img = new Base64Image { 
  FileContents = File.ReadAllBytes("Path to image"), 
  ContentType="image/png" 
};

string base64EncodedImg = base64Img.ToString();

7

Puoi facilmente passare il percorso dell'immagine per recuperare la stringa base64

public static string ImageToBase64(string _imagePath)
    {
        string _base64String = null;

        using (System.Drawing.Image _image = System.Drawing.Image.FromFile(_imagePath))
        {
            using (MemoryStream _mStream = new MemoryStream())
            {
                _image.Save(_mStream, _image.RawFormat);
                byte[] _imageBytes = _mStream.ToArray();
                _base64String = Convert.ToBase64String(_imageBytes);

                return "data:image/jpg;base64," + _base64String;
            }
        }
    }

Spero che questo ti aiuti.


Ciò potrebbe dare problemi se l'input è una gif; lo salva nuovamente come lo stesso tipo (come recuperato da _image.RawFormat) ma espone i dati come tipo MIMEimage/jpg
Nyerguds

3

Puoi usare il Server.Mappercorso per fornire il percorso relativo e quindi puoi creare un'immagine usando la base64conversione oppure puoi semplicemente aggiungere una base64stringa a image src.

byte[] imageArray = System.IO.File.ReadAllBytes(Server.MapPath("~/Images/Upload_Image.png"));

string base64ImageRepresentation = Convert.ToBase64String(imageArray);

1

In questo modo è più semplice passare l'immagine e poi passare il formato.

private static string ImageToBase64(Image image)
{
    var imageStream = new MemoryStream();
    try
    {           
        image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Bmp);
        imageStream.Position = 0;
        var imageBytes = imageStream.ToArray();
        var ImageBase64 = Convert.ToBase64String(imageBytes);
        return ImageBase64;
    }
    catch (Exception ex)
    {
        return "Error converting image to base64!";
    }
    finally
    {
      imageStream.Dispose;
    }
}

0

Il seguente pezzo di codice funziona per me:

string image_path="physical path of your image";
byte[] byes_array = System.IO.File.ReadAllBytes(Server.MapPath(image_path));
string base64String = Convert.ToBase64String(byes_array);

0

Basato sulla risposta più votata, aggiornato per C # 8. Il seguente può essere utilizzato immediatamente. Aggiunto esplicitamente in System.Drawingprecedenza, Imagepoiché si potrebbe utilizzare quella classe da un altro spazio dei nomi in modo predefinito.

public static string ImagePathToBase64(string path)
{
    using System.Drawing.Image image = System.Drawing.Image.FromFile(path);
    using MemoryStream m = new MemoryStream();
    image.Save(m, image.RawFormat);
    byte[] imageBytes = m.ToArray();
    tring base64String = Convert.ToBase64String(imageBytes);
    return base64String;
}

-3

Puoi convertirlo in questo modo

  string test = @"C:/image/1.gif";
  byte[] bytes = System.Text.ASCIIEncoding.ASCII.GetBytes(test);
  string base64String = System.Convert.ToBase64String(bytes);
  Console.WriteLine("Base 64 string: " + base64String);

Produzione

  QzovaW1hZ2UvMS5naWY=

non devi mettere la base 64 come sorgente dell'immagine. il percorso normale dovrebbe essere sufficiente. Qual è il problema che stai affrontando?
Ehsan

6
Questo converte il nome del file in base64 invece dell'immagine stessa.
Olivier Jacot-Descombes

-3

Qualcosa del genere

 Function imgTo64(ByVal thePath As String) As String
    Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(thePath)
    Dim m As IO.MemoryStream = New IO.MemoryStream()

    img.Save(m, img.RawFormat)
    Dim imageBytes As Byte() = m.ToArray
    img.Dispose()

    Dim str64 = Convert.ToBase64String(imageBytes)
    Return str64
End Function

1
hai notato il C#tag sulla domanda?
ADyson
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.