Bir görüntüyü (yola göre seçilir) base64 dizesine dönüştür


111

Kullanıcının bilgisayarındaki bir yoldan bir görüntüyü C # 'da bir base64 dizesine nasıl dönüştürebilirsiniz?

Örneğin, görüntünün yoluna sahibim (formatta C:/image/1.gif) ve döndürülen görüntüyü data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..temsil eden bir veri URI'sine sahip olmak istiyorum 1.gif.


Bunları CSS'ye yerleştirecekseniz, bu görevi sizin için halledebilecek Gulp.js gibi bir buil sistemi yapılandırmayı düşünün
Konstantin Tarkus

2
Yol dizesinin mi yoksa o yerdeki görüntünün bir veri URI'si vererek kodlanmasını mı istiyorsunuz?
Marcel

Yanıtlar:


192

Bunu dene

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
Yine de neden tekrar kurtarmaya zahmet ettin? sadece dosyanın baytlarını okuyabilir ve bunları dönüştürebilirsiniz.
Nyerguds

1
Benim durumumda bunun nedeni, yüklendikten sonra resmi yeniden boyutlandırmak istememdi.
pgee70

@Nyerguds Sanırım bunun nedeni image.RawFormat,.
facepalm42

2
@ facepalm42 RawFormat, bir görüntü biçimi belirticisi değildir; dosyadan okunduğundaimage görüntünün hangi formatta olduğunu döndüren nesnenin bir özelliğidir , yani bu durumda gif formatını döndürür. Bu nedenle, gerçek orijinal dosyanın baytları yerine, .Net çerçevesi tarafından gif'e yeniden kaydedilen görüntünün baytlarına sahip olmanız dışında hiçbir şeyi değiştirmez.
Nyerguds

Bazı nedenlerden dolayı, .Net'in paletlenmiş görüntüler olarak yüklediği animasyonlu GIF'leri görmediğini (yalnızca animasyonlu gif'te olur, ancak bazı png türlerinde de olur ) ve söz konusu "yüksek renkli" görüntüleri paletli biçime yeniden kaydederken unutmayın. , standart bir Windows 256 renkli paleti kullanır. Animasyonlu gifler genellikle optimize edilmiş bir palete sahip olduklarından, bu, bu işlemle kaydedilen herhangi bir animasyonlu gifin kalitesinin korkunç bir şekilde düşeceği anlamına gelir. Dolayısıyla bu kurulum kesinlikle ideal değil; KansaiRobot'un cevabının gösterdiği gibi, sadece orijinal baytları okumak çok daha iyidir.
Nyerguds

105

byte[]Görüntünün bayt dizisi ( ) temsilini alın , ardından Convert.ToBase64String()st kullanın . bunun gibi:

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

Base4 görüntüsünü tekrar System.Drawing.Image'a dönüştürmek için:

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

3
@Smith, eğer base64'ten geri dönüştürmek System.Drawing.Imageistiyorsanız, st. şunun gibi:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian

27

Çoğumuz onelinleri sevdiğimiz için:

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

Base64 bayt dizisi olarak ihtiyacınız varsa:

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

22

Daha karmaşık cevap tamam olsa da, bunun çok daha iyi olduğunu görüyorum

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

Çok basit, farklı formatları yeniden kaydetmenize gerek yok


1
Bu, Ogglas'ın bir yıl + önceki yanıtından ne kadar farklı ?
ruffin

8

Bu amaç için yazdığım ders:

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 dizesini almak için görüntünün yolunu kolayca geçebilirsiniz

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

Umarım bu yardımcı olur.


Giriş bir gif ise bu sorun yaratabilir; aynı tür olarak yeniden kaydeder (alındığı şekliyle _image.RawFormat) ancak verileri mime türü olarak gösteririmage/jpg
Nyerguds

3

Server.MapGöreli yol vermek için yolu kullanabilir ve ardından base64dönüştürme kullanarak görüntü oluşturabilir veya sadece base64dizeye ekleyebilirsiniz image src.

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

string base64ImageRepresentation = Convert.ToBase64String(imageArray);

1

Bu şekilde, görüntüyü ve ardından biçimi ilettiğiniz yerde daha basittir.

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

Aşağıdaki kod parçası benim için çalışıyor:

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

En çok oylanan cevaba göre, C # 8 için güncellendi. Aşağıdakiler kutunun dışında kullanılabilir. Biri bu sınıfı diğer ad alanından varsayılan olarak kullanıyor olabileceğinden daha System.Drawingönce açık eklendi 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

Bunu böyle dönüştürebilirsin

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

Çıktı

  QzovaW1hZ2UvMS5naWY=

Temel 64'ü görüntü kaynağı olarak koymanız gerekmez. normal yol yeterli olmalıdır. Karşılaştığınız sorun nedir?
Ehsan

6
Bu, dosya adını görüntünün kendisi yerine base64'e dönüştürür.
Olivier Jacot-Descombes

-3

Bunun gibi bir şey

 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#soru üzerindeki etiketi fark ettiniz mi?
ADyson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.