将图像(按路径选择)转换为base64字符串


111

如何将图像从用户计算机上的路径转换为C#中的base64字符串?

例如,我有图像的路径(格式为C:/image/1.gif),并且希望有一个数据URI,例如data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..代表1.gif返回的图像。


如果要将它们嵌入CSS中,请考虑配置一个可以帮助您完成此任务的构建系统,例如Gulp.js
Konstantin Tarkus 2014年

2
您是否要编码路径字符串或该位置的图像,并提供数据URI?
Marcel

Answers:


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 '18

@Nyerguds我认为这是因为它必须是原始格式,由image.RawFormat
facepalm42

2
@ facepalm42 RawFormat不是图像格式说明符;它是image对象的属性,它返回从文件读取图像时的格式,在这种情况下,它将返回gif格式。因此,它没有任何改变,除了.Net框架将图像的字节重新保存为gif之外,而不是实际原始文件的字节。
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)));
Arin Ghazarian 2014年

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
与一年多以前的奥格拉斯的答案有何不同?
鲁芬

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),但将数据公开为mime类型image/jpg
Nyerguds

3

您可以使用Server.Mappath来提供相对路径,然后可以使用base64conversion 创建图像,也可以仅将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=

您不必将base 64用作图像源。正常的路径应该足够了。您面临的问题是什么?
Ehsan 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.