Convertir une image (sélectionnée par chemin) en chaîne base64

111

Comment convertir une image d'un chemin sur l'ordinateur de l'utilisateur en une chaîne base64 en C #?

Par exemple, j'ai le chemin d'accès à l'image (au format C:/image/1.gif) et j'aimerais avoir un URI de données comme data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..représentant l' 1.gifimage retournée.

vaj90
la source
Si vous allez les intégrer dans CSS, pensez à configurer un système de construction tel que Gulp.js qui peut gérer cette tâche pour vous
Konstantin Tarkus
2
Voulez-vous que la chaîne de chemin soit encodée ou l'image à cet endroit, en donnant un URI de données?
Marcel

Réponses:

192

Essaye ça

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
la source
5
Pourquoi même se donner la peine de le réenregistrer? vous pouvez simplement lire les octets du fichier et les convertir.
Nyerguds
1
Dans mon cas, c'était parce que je voulais redimensionner l'image après son chargement.
pgee70
@Nyerguds Je pense que c'est parce qu'il doit être au format brut à en juger par le image.RawFormat.
facepalm42
2
@ facepalm42 RawFormatn'est pas un spécificateur de format d'image; c'est une propriété de l' imageobjet, qui renvoie le format dans lequel l'image était lorsqu'elle a été lue à partir d'un fichier , ce qui signifie que dans ce cas, elle renverrait le format gif. Donc, cela ne change rien, sauf qu'au lieu des octets du fichier d'origine, vous avez les octets de l'image comme réenregistrés en gif par le framework .Net.
Nyerguds le
Notez que pour une raison quelconque, .Net ne voit pas les gifs animés, il se charge comme des images palettisées (cela ne se produit que sur des gif animés, bien que cela se produise également avec certains types de png ), et lors de la réenregistrement des images dites "haute couleur" au format palettisé , il utilise une palette standard de 256 couleurs Windows. Étant donné que les gifs animés ont généralement une palette optimisée, cela signifie que tout gif animé enregistré via ce processus verra sa qualité terriblement dégradée. Donc, cette configuration n'est certainement pas idéale; il est préférable de simplement lire les octets d'origine, comme le montre la réponse de KansaiRobot.
Nyerguds
105

Obtenez la byte[]représentation tableau d'octets ( ) de l'image, puis utilisez Convert.ToBase64String(), st. comme ça:

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

Pour reconvertir une image base4 en System.Drawing.Image:

var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
la source
3
@Smith, si vous voulez convertir de base64 en System.Drawing.Imagevous pouvez utiliser st. comme ça:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian
27

Puisque la plupart d'entre nous aiment les oneliners:

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

Si vous en avez besoin en tant que tableau d'octets Base64:

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

Bien que la réponse la plus compliquée soit correcte, je trouve que c'est beaucoup mieux

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

C'est simple, vous n'avez pas besoin de réenregistrer et gère différents formats

KansaiRobot
la source
1
En quoi est-ce différent de la réponse d' Ogglas d'un an et plus?
ruffin le
8

Voici le cours que j'ai écrit à cet effet:

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
la source
7

Vous pouvez facilement passer le chemin de l'image pour récupérer la chaîne 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;
            }
        }
    }

J'espère que cela aidera.

sumith madhushan
la source
Cela pourrait poser des problèmes si l'entrée est un gif; il le réenregistre sous le même type (comme récupéré à partir de _image.RawFormat) mais expose les données en tant que type mimeimage/jpg
Nyerguds
3

Vous pouvez utiliser le Server.Mapchemin pour donner un chemin relatif, puis vous pouvez soit créer une image en utilisant la base64conversion, soit simplement ajouter une base64chaîne à image src.

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

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

De cette façon, c'est plus simple, où vous passez l'image, puis passez le 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
la source
0

Le morceau de code suivant fonctionne pour moi:

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
la source
0

Basé sur la réponse la plus votée, mis à jour pour C # 8. Les éléments suivants peuvent être utilisés prêts à l'emploi. Ajouté explicite System.Drawingavant Imagecar on pourrait utiliser cette classe à partir d'un autre espace de noms par défaut.

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
la source
-3

Vous pouvez le convertir comme ça

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

Production

  QzovaW1hZ2UvMS5naWY=
Ehsan
la source
vous n'avez pas besoin de mettre la base 64 comme source d'image. le chemin normal devrait suffire. Quel est le problème auquel vous faites face?
Ehsan
6
Cela convertit le nom du fichier en base64 au lieu de l'image elle-même.
Olivier Jacot-Descombes
-3

Quelque chose comme ca

 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
la source
1
avez-vous remarqué l' C#étiquette sur la question?
ADyson