Convertir una imagen (seleccionada por ruta) a cadena base64

111

¿Cómo se convierte una imagen de una ruta en la computadora del usuario a una cadena base64 en C #?

Por ejemplo, tengo la ruta a la imagen (en el formato C:/image/1.gif) y me gustaría tener un URI de datos que data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..represente la 1.gifimagen devuelta.

vaj90
fuente
Si los va a incrustar en CSS, piense en configurar un sistema de compilación como Gulp.js que pueda manejar esta tarea por usted
Konstantin Tarkus
2
¿Desea que se codifique la cadena de ruta o la imagen en ese lugar, dando un URI de datos?
Marcel

Respuestas:

192

Prueba esto

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
fuente
5
¿Por qué molestarse en volver a guardarlo? puede leer los bytes del archivo y convertirlos.
Nyerguds
1
En mi caso, fue porque quería cambiar el tamaño de la imagen después de que se cargó.
pgee70
@Nyerguds Creo que es porque necesita ser formato sin procesar a juzgar por el image.RawFormat.
facepalm42
2
@ facepalm42 RawFormatno es un especificador de formato de imagen; es una propiedad del imageobjeto, que devuelve en qué formato estaba la imagen cuando se leyó del archivo , lo que significa que, en este caso, devolvería el formato gif. Entonces, no cambia nada, excepto que en lugar de los bytes del archivo original real, tiene los bytes de la imagen como re-guardados en gif por el marco .Net.
Nyerguds
Tenga en cuenta que, por alguna razón, .Net no ve los gifs animados, se carga como imágenes con paleta (solo ocurre en gif animados, aunque también ocurre con algunos tipos de png ), y cuando se vuelven a guardar dichas imágenes de "alto color" en formato de paleta , utiliza una paleta estándar de Windows de 256 colores. Dado que los gifs animados generalmente tienen una paleta optimizada, esto significa que cualquier gif animado guardado a través de este proceso verá su calidad horriblemente degradada. Así que esta configuración definitivamente no es ideal; es mucho mejor leer los bytes originales, como muestra la respuesta de KansaiRobot.
Nyerguds
105

Obtenga la byte[]representación de la imagen de matriz de bytes ( ), luego use Convert.ToBase64String(), st. Me gusta esto:

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

Para convertir una imagen base4 de nuevo a System.Drawing.Image:

var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
fuente
3
@Smith, si te refieres a convertir de base64 a System.Drawing.Imagepuedes usar st. así:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
27

Dado que a la mayoría de nosotros nos gustan los delineadores:

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

Si lo necesita como matriz de bytes Base64:

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

Aunque la respuesta más complicada está bien, encuentro que esto es mucho mejor

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

Es simple, no necesita volver a guardar y maneja diferentes formatos

KansaiRobot
fuente
1
¿En qué se diferencia esto de la respuesta de Ogglas de un año + antes?
ruffin
8

Esta es la clase que escribí para este propósito:

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
fuente
7

Puede pasar fácilmente la ruta de la imagen para recuperar la cadena 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;
            }
        }
    }

Espero que esto ayude.

sumith madhushan
fuente
Eso podría dar problemas si la entrada es un gif; lo vuelve a guardar como del mismo tipo (como se obtuvo _image.RawFormat) pero expone los datos como tipo mimeimage/jpg
Nyerguds
3

Puede usar la Server.Mapruta para dar una ruta relativa y luego puede crear una imagen usando la base64conversión o simplemente puede agregar una base64cadena image src.

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

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

De esa forma es más sencillo, donde pasas la imagen y luego el 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;
    }
}
Elías Filipe
fuente
0

El siguiente código me funciona:

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
fuente
0

Basado en la respuesta más votada, actualizada para C # 8. Lo siguiente se puede usar de inmediato. Se agregó explícitamente System.Drawingantes, Imageya que uno podría estar usando esa clase desde otro espacio de nombres de forma predeterminada.

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
fuente
-3

Puedes convertirlo así

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

Salida

  QzovaW1hZ2UvMS5naWY=
Ehsan
fuente
no tiene que poner la base 64 como fuente de imagen. El camino normal debería ser suficiente. ¿Cuál es el problema al que te enfrentas?
Ehsan
6
Esto convierte el nombre del archivo a base64 en lugar de la imagen en sí.
Olivier Jacot-Descombes
-3

Algo como eso

 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
fuente
1
¿Notaste la C#etiqueta en la pregunta?
ADyson