Перетворіть зображення (вибране шляхом) у рядок 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

1
У моєму випадку це було тому, що я хотів змінити розмір зображення після завантаження.
pgee70

@Nyerguds Я думаю, що це тому, що він повинен бути в сирому форматі, судячи з image.RawFormat.
facepalm42

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

Зауважте, що чомусь .Net не бачить анімовані gif-файли, вони завантажуються як палітріровані зображення (трапляється лише на анімовані gif, хоча це трапляється і з деякими типами png ), і при повторному збереженні зазначених "кольорових" зображень у палетовому форматі , він використовує стандартну палітру кольорів Windows 256. Оскільки анімовані 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)));
Арін Газарян

27

Оскільки більшості з нас подобаються oneliners:

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

Сподіваюсь, це допоможе.


Це може спричинити проблеми, якщо вхід є gif; він повторно зберігає їх як той самий тип (як отримано з _image.RawFormat), але викриває дані як тип mimeimage/jpg
Nyerguds

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 як джерело зображення. нормального шляху має бути достатньо. З якою проблемою ви стикаєтесь?
Ехсан

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.