Chuyển đổi hình ảnh (được chọn theo đường dẫn) thành chuỗi base64


111

Làm cách nào để bạn chuyển đổi một hình ảnh từ một đường dẫn trên máy tính của người dùng thành một chuỗi base64 trong C #?

Ví dụ: tôi có đường dẫn đến hình ảnh (ở định dạng C:/image/1.gif ) và muốn có một URI dữ liệu như data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..đại diện cho 1.gifhình ảnh được trả về.


Nếu bạn đang đi để nhúng chúng vào CSS, suy nghĩ về cấu hình hệ thống buil như Gulp.js mà có thể xử lý công việc này cho bạn
Konstantin Tarkus

2
Bạn có muốn chuỗi đường dẫn được mã hóa hoặc hình ảnh tại vị trí đó, tạo ra một URI dữ liệu?
Marcel

Câu trả lời:


192

Thử cái này

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
Tại sao thậm chí bận tâm khôi phục nó mặc dù? bạn chỉ có thể đọc các byte của tệp và chuyển đổi chúng.
Nyerguds

1
Trong trường hợp của tôi, đó là vì tôi muốn thay đổi kích thước hình ảnh sau khi nó được tải.
pgee70

@Nyerguds Tôi nghĩ đó là vì nó cần phải là định dạng thô đánh giá image.RawFormat.
facepalm42

2
@ facepalm42 RawFormatkhông phải là công cụ xác định định dạng hình ảnh; đó là một thuộc tính của imageđối tượng, trả về định dạng hình ảnh khi nó được đọc từ tệp , có nghĩa là trong trường hợp này, nó sẽ trả về định dạng gif. Vì vậy, nó không có gì thay đổi, ngoại trừ việc thay vì byte của tệp gốc thực tế, bạn có các byte của hình ảnh được lưu lại thành gif bởi .Net framework.
Nyerguds

Lưu ý rằng vì một số lý do, .Net không thấy các ảnh gif động mà nó tải dưới dạng hình ảnh được xếp vào bảng màu (chỉ xảy ra trên gif động, mặc dù nó cũng xảy ra với một số loại png ) và khi lưu lại các hình ảnh "màu cao" đã nói ở định dạng bảng màu , nó sử dụng bảng màu 256 tiêu chuẩn của Windows. Vì ảnh gif động thường có bảng màu được tối ưu hóa, điều này có nghĩa là bất kỳ ảnh gif động nào được lưu qua quá trình này sẽ bị giảm chất lượng một cách khủng khiếp. Vì vậy, thiết lập này chắc chắn không phải là lý tưởng; tốt hơn nhiều là chỉ đọc các byte gốc, như câu trả lời của KansaiRobot cho thấy.
Nyerguds

105

Lấy biểu diễn mảng byte ( byte[]) của hình ảnh, sau đó sử dụng Convert.ToBase64String(), st. như thế này:

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

Để chuyển đổi hình ảnh base4 trở lại System.Drawing.Image:

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

3
@Smith, nếu bạn muốn chuyển đổi trở lại từ base64 thành System.Drawing.Imagebạn có thể sử dụng st. như thế này:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian

27

Vì hầu hết chúng ta đều thích oneliners:

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

Nếu bạn cần nó dưới dạng mảng byte Base64:

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

22

Mặc dù câu trả lời phức tạp hơn là được nhưng tôi thấy rằng câu trả lời này tốt hơn nhiều

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

Nó đơn giản, bạn không cần phải lưu lại và xử lý các định dạng khác nhau


1
Câu trả lời này khác với câu trả lời của Ogglas từ một năm trước đó như thế nào?
ruffin

8

Đây là lớp tôi đã viết cho mục đích này:

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

Bạn có thể dễ dàng vượt qua đường dẫn của hình ảnh để lấy chuỗi 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;
            }
        }
    }

Hy vọng điều này sẽ giúp ích.


Điều đó có thể gây ra vấn đề nếu đầu vào là gif; nó lại lưu nó như các loại tương tự (lấy từ _image.RawFormat) nhưng thấy nhiều dữ liệu như kịch câm loạiimage/jpg
Nyerguds

3

Bạn có thể sử dụng Server.Mapđường dẫn để cung cấp đường dẫn tương đối và sau đó bạn có thể tạo hình ảnh bằng cách sử dụng base64chuyển đổi hoặc bạn chỉ có thể thêm base64chuỗi vào image src.

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

string base64ImageRepresentation = Convert.ToBase64String(imageArray);

1

Bằng cách đó, nó đơn giản hơn, nơi bạn chuyển hình ảnh và sau đó chuyển định dạng.

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

Đoạn mã sau phù hợp với tôi:

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

Dựa trên câu trả lời được bình chọn nhiều nhất, được cập nhật cho C # 8. Sau đây có thể được sử dụng ngoài hộp. Đã thêm rõ ràng System.Drawingtrước khi Imagemột người có thể đang sử dụng lớp đó từ không gian tên khác theo mặc định.

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

Bạn có thể chuyển đổi nó như thế này

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

Đầu ra

  QzovaW1hZ2UvMS5naWY=

bạn không cần phải đặt cơ sở 64 làm nguồn hình ảnh. con đường bình thường phải là đủ. Vấn đề mà bạn đang gặp phải là gì?
Ehsan

6
Điều này chuyển đổi tên tệp thành base64 thay vì chính hình ảnh.
Olivier Jacot-Descombes

-3

Đại loại như vậy

 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
bạn có nhận thấy C#thẻ trên câu hỏi không?
ADyson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.