Konvertieren Sie ein Bild (ausgewählt nach Pfad) in eine base64-Zeichenfolge

110

Wie konvertiert man ein Bild von einem Pfad auf dem Computer des Benutzers in eine base64-Zeichenfolge in C #?

Zum Beispiel habe ich den Pfad zum Bild (im Format C:/image/1.gif) und möchte einen Daten-URI, data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..der das zurückgegebene 1.gifBild darstellt.

vaj90
quelle
Wenn Sie sie in CSS einbetten möchten, sollten Sie ein Buil-System wie Gulp.js konfigurieren, das diese Aufgabe für Sie erledigt
Konstantin Tarkus,
2
Möchten Sie, dass die Pfadzeichenfolge oder das Bild an dieser Stelle codiert wird und eine Daten-URI angegeben wird?
Marcel

Antworten:

191

Versuche dies

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;
    }
}
Nitin Varpe
quelle
5
Warum sollte man sich überhaupt die Mühe machen, es erneut zu speichern? Sie können einfach die Bytes der Datei lesen und diese konvertieren.
Nyerguds
1
In meinem Fall lag es daran, dass ich die Größe des Bildes nach dem Laden ändern wollte.
pgee70
@Nyerguds Ich denke, es liegt daran, dass es ein Rohformat sein muss, nach dem zu urteilen image.RawFormat.
facepalm42
2
@ facepalm42 RawFormatist kein Bildformatspezifizierer; Es ist eine Eigenschaft des imageObjekts, die zurückgibt, in welchem ​​Format sich das Bild befand, als es aus einer Datei gelesen wurde. In diesem Fall bedeutet dies, dass das GIF-Format zurückgegeben wird. Es ändert sich also nichts, außer dass Sie anstelle der Bytes der eigentlichen Originaldatei die Bytes des Bildes haben, die vom .Net-Framework erneut in gif gespeichert wurden.
Nyerguds
Beachten Sie, dass .Net aus irgendeinem Grund keine animierten Gifs sieht, die als palettierte Bilder geladen werden (nur bei animierten Gifs, obwohl dies auch bei einigen Arten von PNGs der Fall ist) und beim erneuten Speichern der Bilder mit "hohen Farben" im palettierten Format verwendet eine Standard-Windows 256-Farbpalette. Da animierte Gifs normalerweise eine optimierte Palette haben, bedeutet dies, dass die Qualität aller animierten Gifs, die durch diesen Prozess gespeichert werden, schrecklich beeinträchtigt wird. Dieses Setup ist also definitiv nicht ideal. Es ist viel besser, nur die Originalbytes zu lesen, wie die Antwort von KansaiRobot zeigt.
Nyerguds
103

Holen Sie sich die Byte-Array ( byte[]) -Darstellung des Bildes und verwenden Sie dann Convert.ToBase64String()st. so was:

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

So konvertieren Sie ein base4-Image zurück in ein System.Drawing.Image:

var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
quelle
3
@ Smith, wenn du meinst, von base64 zurück zu konvertieren, System.Drawing.Imagekannst du st verwenden. so:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
27

Da die meisten von uns Oneliner mögen:

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

Wenn Sie es als Base64-Byte-Array benötigen:

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

Obwohl die kompliziertere Antwort in Ordnung ist, finde ich, dass dies viel besser ist

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

Es ist einfach, Sie müssen nicht erneut speichern und verschiedene Formate verarbeiten

KansaiRobot
quelle
1
Wie unterscheidet sich das von Ogglas 'Antwort von einem Jahr zuvor?
Ruffin
8

Dies ist die Klasse, die ich zu diesem Zweck geschrieben habe:

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();
Jeremy Bell
quelle
7

Sie können den Pfad des Bildes einfach übergeben, um die base64-Zeichenfolge abzurufen

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

Hoffe das wird helfen.

Sumith Madhushan
quelle
Dies kann zu Problemen führen, wenn die Eingabe ein GIF ist. es speichert es erneut als den gleichen Typ (wie von abgerufen _image.RawFormat), macht die Daten jedoch als image/jpg
MIME-
3

Sie können den Server.MapPfad verwenden, um einen relativen Pfad anzugeben, und dann können Sie entweder ein Bild mithilfe der base64Konvertierung erstellen oder einfach eine base64Zeichenfolge hinzufügen image src.

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

string base64ImageRepresentation = Convert.ToBase64String(imageArray);
nikunjM
quelle
1

Auf diese Weise ist es einfacher, wenn Sie das Bild und dann das Format übergeben.

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;
    }
}
Elias Filipe
quelle
0

Der folgende Code funktioniert für mich:

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);
Jamil Moughal
quelle
0

Basierend auf der am besten bewerteten Antwort, aktualisiert für C # 8. Das Folgende kann sofort verwendet werden. System.DrawingVorher explizit hinzugefügt, Imageda diese Klasse möglicherweise standardmäßig aus einem anderen Namespace verwendet wird.

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;
}
Matěj Štágl
quelle
-3

Sie können es so konvertieren

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

Ausgabe

  QzovaW1hZ2UvMS5naWY=
Ehsan
quelle
Sie müssen Base 64 nicht als Bildquelle verwenden. normaler Weg sollte ausreichen. Was ist das Problem, mit dem Sie konfrontiert sind?
Ehsan
6
Dadurch wird der Dateiname in base64 anstelle des Abbilds selbst konvertiert.
Olivier Jacot-Descombes
-3

Sowas in der Art

 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
Pao Xu
quelle
1
Haben Sie das C#Tag auf der Frage bemerkt ?
ADyson