Преобразование изображения (выбранного по пути) в строку base64


111

Как преобразовать изображение из пути на компьютере пользователя в строку base64 в C #?

Например, у меня есть путь к изображению (в формате C:/image/1.gif), и я хотел бы иметь URI данных, например, data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..представляющий 1.gifвозвращенное изображение.


Если вы собираетесь встраивать их в CSS, подумайте о настройке системы сборки, такой как Gulp.js, которая сможет справиться с этой задачей за вас,
Константин Таркус

2
Вы хотите, чтобы строка пути была закодирована или изображение в этом месте с указанием URI данных?
Марсель

Ответы:


192

Попробуй это

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

5
Зачем вообще его спасать? вы можете просто прочитать байты файла и преобразовать их.
Nyerguds 01

1
В моем случае это было потому, что я хотел изменить размер изображения после его загрузки.
pgee70

@Nyerguds Я думаю, это потому, что судя по формату image.RawFormat.
facepalm42

2
@ facepalm42 RawFormatне является спецификатором формата изображения; это свойство imageобъекта, которое возвращает, в каком формате было изображение, когда оно было прочитано из файла , то есть в данном случае оно вернет формат gif. Таким образом, это ничего не меняет, за исключением того, что вместо фактических байтов исходного файла у вас есть байты изображения, повторно сохраненные в gif инфраструктурой .Net.
Nyerguds

Обратите внимание, что по какой-то причине .Net не видит анимированные GIF-файлы, которые загружаются как изображения с палитрой (происходит только с анимированными GIF-изображениями, хотя такое бывает и с некоторыми типами PNG ), и при повторном сохранении указанных изображений с высоким содержанием цвета в формат с палитрой , он использует стандартную 256-цветовую палитру Windows. Поскольку анимированные GIF-файлы обычно имеют оптимизированную палитру, это означает, что качество любого анимированного GIF-изображения, сохраненного с помощью этого процесса, будет ужасно ухудшено. Так что эта установка определенно не идеальна; Как показывает ответ KansaiRobot, гораздо лучше просто прочитать исходные байты.
Nyerguds

105

Получите byte[]представление изображения в виде массива байтов ( ), затем используйте Convert.ToBase64String()st. как это:

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

Чтобы преобразовать изображение base4 обратно в System.Drawing.Image:

var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));

3
@Smith, если вы имеете в виду обратное преобразование из base64 в, System.Drawing.Imageвы можете использовать st. вот так:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian

27

Поскольку большинству из нас нравятся строчки:

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

Если он вам нужен как байтовый массив Base64:

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

22

Хотя более сложный ответ в порядке, я считаю, что это намного лучше

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

Это просто, вам не нужно повторно сохранять и обрабатывать разные форматы


1
Чем это отличается от ответа Оггласа годом ранее?
ruffin

8

Это класс, который я написал для этой цели:

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

7

Вы можете легко передать путь к изображению, чтобы получить строку 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;
            }
        }
    }

Надеюсь, это поможет.


Это может вызвать проблемы, если ввод - это гифка; он повторно сохраняет его как тот же тип (как получено из _image.RawFormat), но предоставляет данные как тип пантомимыimage/jpg
Ньергудс

3

Вы можете использовать Server.Mapпуть для указания относительного пути, а затем вы можете либо создать изображение с помощью base64преобразования, либо просто добавить base64строку в image src.

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

string base64ImageRepresentation = Convert.ToBase64String(imageArray);

1

Так проще: вы передаете изображение, а затем передаете формат.

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

0

У меня работает следующий фрагмент кода:

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

0

На основе ответов, получивших наибольшее количество голосов, обновлено для C # 8. Следующее можно использовать из коробки. Явно добавлено System.Drawingранее, Imageпоскольку по умолчанию можно было использовать этот класс из другого пространства имен.

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

-3

Вы можете преобразовать это так

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

Вывод

  QzovaW1hZ2UvMS5naWY=

вам не нужно указывать базу 64 в качестве источника изображения. нормального пути должно хватить. С какой проблемой вы столкнулись?
Ehsan

6
Это преобразует имя файла в base64 вместо самого изображения.
Оливье Жако-Декомб,

-3

Что-то такое

 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

1
вы заметили C#метку на вопросе?
ADyson
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.