Mengonversi gambar (dipilih dengan jalur) menjadi string base64


111

Bagaimana Anda mengonversi gambar dari jalur di komputer pengguna menjadi string base64 di C #?

Misalnya, saya memiliki jalur ke gambar (dalam format C:/image/1.gif) dan ingin memiliki URI data seperti data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..mewakili 1.gifgambar yang dikembalikan.


Jika Anda akan menyematkannya ke dalam CSS, pikirkan tentang mengonfigurasi sistem buil seperti Gulp.js yang dapat menangani tugas ini untuk Anda
Konstantin Tarkus

2
Apakah Anda ingin string jalur dienkode atau gambar di tempat itu, memberikan URI data?
Marcel

Jawaban:


192

Coba ini

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
Mengapa repot-repot menyimpannya kembali? Anda bisa membaca byte file dan mengonversinya.
Nyerguds

1
Dalam kasus saya itu karena saya ingin mengubah ukuran gambar setelah dimuat.
pgee70

@Nyerguds Saya pikir itu karena perlu format mentah dilihat dari image.RawFormat.
facepalm42

2
@ facepalm42 RawFormatbukanlah penentu format gambar; itu adalah properti imageobjek, yang mengembalikan format gambar saat dibaca dari file , yang berarti dalam kasus ini, itu akan mengembalikan format gif. Jadi itu tidak mengubah apa pun, kecuali bahwa alih-alih byte file asli yang sebenarnya, Anda memiliki byte gambar sebagai disimpan ulang ke gif oleh kerangka kerja .Net.
Nyerguds

Perhatikan bahwa karena alasan tertentu, .Net tidak melihat gif animasi yang dimuat sebagai gambar berpalet (hanya terjadi pada gif animasi, meskipun terjadi pada beberapa jenis png juga), dan saat menyimpan ulang gambar "warna tinggi" tersebut ke format palet , menggunakan palet warna standar Windows 256. Karena gif animasi biasanya memiliki palet yang dioptimalkan, ini berarti gif animasi apa pun yang disimpan melalui proses ini akan mengalami penurunan kualitas yang mengerikan. Jadi pengaturan ini jelas tidak ideal; jauh lebih baik membaca byte aslinya, seperti yang ditunjukkan oleh jawaban KansaiRobot.
Nyerguds

105

Dapatkan byte[]representasi byte array ( ) dari gambar, kemudian gunakan Convert.ToBase64String(), st. seperti ini:

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

Untuk mengonversi gambar base4 kembali ke System.Drawing.Image:

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

3
@Smith, jika Anda bermaksud mengkonversi kembali dari base64 ke System.Drawing.ImageAnda dapat menggunakan st. seperti ini:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian

27

Karena kebanyakan dari kita menyukai oneliners:

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

Jika Anda membutuhkannya sebagai array byte Base64:

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

22

Meskipun jawaban yang lebih rumit adalah baik, saya menemukan bahwa ini jauh lebih baik

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

Ini sederhana, Anda tidak perlu menyimpan ulang dan menangani format yang berbeda


1
Bagaimana ini berbeda dengan jawaban Ogglas dari tahun + sebelumnya?
ruffin

8

Ini adalah kelas yang saya tulis untuk tujuan ini:

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

Anda dapat dengan mudah melewati jalur gambar untuk mengambil 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;
            }
        }
    }

Semoga ini bisa membantu.


Itu mungkin menimbulkan masalah jika inputnya adalah gif; itu menyimpannya kembali sebagai jenis yang sama (seperti yang diambil dari _image.RawFormat) tetapi menampilkan data sebagai jenis pantomimimage/jpg
Nyerguds

3

Anda dapat menggunakan Server.Mapjalur untuk memberikan jalur relatif dan kemudian Anda dapat membuat gambar menggunakan base64konversi atau Anda dapat menambahkan base64string ke image src.

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

string base64ImageRepresentation = Convert.ToBase64String(imageArray);

1

Dengan cara itu lebih sederhana, di mana Anda melewatkan gambar dan kemudian meneruskan formatnya.

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

Potongan kode berikut berfungsi untuk saya:

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

Berdasarkan jawaban pilihan teratas, diperbarui untuk C # 8. Berikut ini dapat digunakan di luar kotak. Ditambahkan secara eksplisit System.Drawingsebelumnya Imagekarena seseorang mungkin menggunakan kelas itu dari namespace lain secara default.

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

Anda dapat mengubahnya seperti ini

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

Keluaran

  QzovaW1hZ2UvMS5naWY=

Anda tidak harus menempatkan basis 64 sebagai sumber gambar. jalur normal seharusnya cukup. Apa masalah yang Anda hadapi?
Ehsan

6
Ini mengubah nama file menjadi base64, bukan gambar itu sendiri.
Olivier Jacot-Descombes

-3

Sesuatu seperti itu

 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
apakah Anda memperhatikan C#tag pada pertanyaan?
ADyson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.