Converter uma imagem (selecionada por caminho) em string base64

111

Como você converte uma imagem de um caminho no computador do usuário em uma string base64 em C #?

Por exemplo, tenho o caminho para a imagem (no formato C:/image/1.gif) e gostaria de ter um URI de dados como o que data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..representa a 1.gifimagem retornada.

vaj90
fonte
Se você for incorporá-los ao CSS, pense em configurar um sistema de construção como o Gulp.js, que pode realizar essa tarefa para você
Konstantin Tarkus
2
Você quer que a string do caminho seja codificada ou a imagem naquele lugar, fornecendo um URI de dados?
Marcel

Respostas:

192

Tente isto

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
fonte
5
Por que se preocupar em salvá-lo novamente? você pode apenas ler os bytes do arquivo e convertê-los.
Nyerguds 01 de
1
No meu caso, foi porque queria redimensionar a imagem depois de carregada.
pgee70
@Nyerguds Acho que é porque precisa estar no formato bruto, a julgar pelo image.RawFormat.
facepalm42
2
@ facepalm42 RawFormatnão é um especificador de formato de imagem; é uma propriedade do imageobjeto, que retorna em qual formato a imagem estava quando foi lida do arquivo , ou seja, neste caso, ela retornaria o formato gif. Portanto, não muda nada, exceto que, em vez dos bytes do arquivo original real, você tem os bytes da imagem salvos novamente em gif pela estrutura .Net.
Nyerguds
Observe que, por alguma razão, .Net não vê gifs animados, ele carrega como imagens da paleta (só acontece em gifs animados, embora também aconteça com alguns tipos de png ), e ao salvar novamente as imagens "high color" no formato paletted , ele usa uma paleta de 256 cores padrão do Windows. Como os gifs animados geralmente têm uma paleta otimizada, isso significa que qualquer gif animado salvo por meio desse processo terá sua qualidade terrivelmente degradada. Portanto, essa configuração definitivamente não é a ideal; é muito melhor apenas ler os bytes originais, como mostra a resposta de KansaiRobot.
Nyerguds
104

Obtenha a byte[]representação de array de bytes ( ) da imagem e, em seguida Convert.ToBase64String(), use st. como isso:

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

Para converter uma imagem base4 de volta em System.Drawing.Image:

var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
fonte
3
@Smith, se você quer dizer converter de volta de base64 para System.Drawing.Imagevocê pode usar st. assim:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
27

Como a maioria de nós gosta de oneliners:

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

Se você precisar dele como matriz de bytes Base64:

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

Embora a resposta mais complicada seja ok, acho que isso é muito melhor

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

É simples, você não precisa salvar novamente e lida com formatos diferentes

KansaiRobot
fonte
1
Como isso é diferente da resposta de Ogglas de um ano ou mais antes?
ruffin
8

Esta é a aula que escrevi 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
fonte
7

Você pode facilmente passar o caminho da imagem para recuperar a string 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 isso ajude.

sumith madhushan
fonte
Isso pode causar problemas se a entrada for um GIF; ele o salva novamente como o mesmo tipo (conforme buscado _image.RawFormat), mas expõe os dados como tipo MIMEimage/jpg
Nyerguds
3

Você pode usar o Server.Mapcaminho para fornecer o caminho relativo e, em seguida, criar uma imagem usando a base64conversão ou apenas adicionar uma base64string a image src.

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

string base64ImageRepresentation = Convert.ToBase64String(imageArray);
NikunjM
fonte
1

Assim é mais simples, onde passa a imagem e depois passa o 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;
    }
}
Elias Filipe
fonte
0

O código a seguir funciona para mim:

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

Com base na resposta mais votada, atualizada para C # 8. O seguinte pode ser usado fora da caixa. Adicionado explícito System.Drawingantes, Imagejá que se pode usar essa classe de outro namespace padrão.

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

Você pode convertê-lo assim

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

Resultado

  QzovaW1hZ2UvMS5naWY=
Ehsan
fonte
você não precisa colocar a base 64 como fonte de imagem. caminho normal deve ser suficiente. Qual é o problema que você está enfrentando?
Ehsan
6
Isso converte o nome do arquivo em base64 em vez da própria imagem.
Olivier Jacot-Descombes
-3

Algo parecido

 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
fonte
1
você notou a C#tag na pergunta?
ADyson