Konwertuj obraz (wybrany przez ścieżkę) na ciąg base64

111

Jak przekonwertować obraz ze ścieżki na komputerze użytkownika na ciąg base64 w języku C #?

Na przykład mam ścieżkę do obrazu (w formacie C:/image/1.gif) i chciałbym mieć identyfikator URI danych, taki jak data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..reprezentujący 1.gifzwrócony obraz.

vaj90
źródło
Jeśli zamierzasz osadzić je w CSS, pomyśl o skonfigurowaniu systemu buil, takiego jak Gulp.js, który poradzi sobie z tym zadaniem za Ciebie
Konstantin Tarkus
2
Czy chcesz, aby ciąg ścieżki został zakodowany, czy obraz w tym miejscu, podając identyfikator URI danych?
Marcel

Odpowiedzi:

192

Spróbuj tego

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
źródło
5
Po co jednak zawracać sobie głowę ponownym zapisywaniem go? możesz po prostu odczytać bajty pliku i przekonwertować je.
Nyerguds
1
W moim przypadku było to spowodowane tym, że chciałem zmienić rozmiar obrazu po jego załadowaniu.
pgee70
@Nyerguds Myślę, że to dlatego, że musi to być format surowy, sądząc po pliku image.RawFormat.
facepalm42
2
@ facepalm42 RawFormatnie jest specyfikatorem formatu obrazu; jest to właściwość imageobiektu, która zwraca format obrazu podczas odczytu z pliku , co oznacza, że ​​w tym przypadku zwróci format gif. Więc to nic nie zmienia, z wyjątkiem tego, że zamiast rzeczywistych bajtów oryginalnego pliku masz bajty obrazu ponownie zapisane do gif przez framework .Net.
Nyerguds
Zauważ, że z jakiegoś powodu .Net nie widzi animowanych gifów, które ładuje się jako obrazy z paletą (dzieje się to tylko na animowanych gifach, chociaż zdarza się to również z niektórymi typami png ), a podczas ponownego zapisywania wspomnianych obrazów o wysokim kolorze do formatu z paletą , używa standardowej palety 256 kolorów systemu Windows. Ponieważ animowane gify mają zwykle zoptymalizowaną paletę, oznacza to, że każdy animowany gif zapisany w tym procesie będzie miał strasznie obniżoną jakość. Więc ta konfiguracja zdecydowanie nie jest idealna; o wiele lepiej jest po prostu przeczytać oryginalne bajty, jak pokazuje odpowiedź KansaiRobot.
Nyerguds
105

Pobierz byte[]reprezentację obrazu w postaci tablicy bajtów ( ), a następnie użyj Convert.ToBase64String(), st. lubię to:

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

Aby przekonwertować obraz base4 z powrotem na System.Drawing.Image:

var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
źródło
3
@Smith, jeśli masz na myśli konwersję z powrotem z base64 na System.Drawing.Imagemożesz użyć st. tak:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
27

Ponieważ większość z nas lubi onelinery:

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

Jeśli potrzebujesz go jako tablicy bajtów Base64:

Encoding.ASCII.GetBytes(Convert.ToBase64String(File.ReadAllBytes(imageFilepath)));
Ogglas
źródło
22

Chociaż bardziej skomplikowana odpowiedź jest w porządku, uważam, że jest o wiele lepsza

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

Jest to proste, nie ma potrzeby ponownego zapisywania i obsługuje różne formaty

KansaiRobot
źródło
1
Czym różni się to od odpowiedzi Ogglasa sprzed roku?
ruffin
8

Oto klasa, którą napisałem w tym celu:

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
źródło
7

Możesz łatwo podać ścieżkę obrazu, aby pobrać ciąg 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;
            }
        }
    }

Mam nadzieję, że to pomoże.

sumith madhushan
źródło
Może to powodować problemy, jeśli dane wejściowe to gif; ponownie zapisuje go jako ten sam typ (pobrany z _image.RawFormat), ale ujawnia dane jako typ MIMEimage/jpg
Nyerguds.
3

Możesz użyć Server.Mappath, aby podać ścieżkę względną, a następnie możesz utworzyć obraz za pomocą base64konwersji lub po prostu dodać base64ciąg do image src.

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

string base64ImageRepresentation = Convert.ToBase64String(imageArray);
nikunjM
źródło
1

W ten sposób jest prostsze, gdy przekazujesz obraz, a następnie przekazujesz format.

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
źródło
0

U mnie działa następujący fragment kodu:

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
źródło
0

W oparciu o najczęściej głosowaną odpowiedź, zaktualizowany dla języka C # 8. Następujących można używać po wyjęciu z pudełka. Dodano wyraźnie System.Drawingwcześniej, Imageponieważ można domyślnie używać tej klasy z innej przestrzeni nazw.

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
źródło
-3

Możesz to przekonwertować w ten sposób

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

Wynik

  QzovaW1hZ2UvMS5naWY=
Ehsan
źródło
nie musisz umieszczać base 64 jako źródła obrazu. normalna ścieżka powinna wystarczyć. Jaki jest problem, z którym masz do czynienia?
Ehsan
6
To konwertuje nazwę pliku na base64 zamiast samego obrazu.
Olivier Jacot-Descombes
-3

Coś w tym stylu

 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
źródło
1
zauważyłeś C#tag w pytaniu?
ADyson