【问题标题】:Convert an image (selected by path) to base64 string将图像(按路径选择)转换为 base64 字符串
【发布时间】:2014-02-15 00:47:59
【问题描述】:

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

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

【问题讨论】:

  • 如果你要将它们嵌入到 CSS 中,请考虑配置一个构建系统,例如 Gulp.js,它可以为你处理此任务
  • 你要编码路径字符串还是那个地方的图像,给一个数据URI?

标签: c# image base64


【解决方案1】:

试试这个

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

【讨论】:

  • 为什么还要费心重新保存它呢?您可以读取文件的字节并进行转换。
  • 就我而言,这是因为我想在加载后调整图像大小。
  • @Nyerguds 我认为这是因为它需要是由image.RawFormat 判断的原始格式。
  • @facepalm42 RawFormat 不是图像格式说明符;它是image 对象的一个​​属性,它返回图像在从文件中读取 时的格式,这意味着在这种情况下,它会返回gif 格式。所以它什么都没有改变,除了实际的原始文件的字节,你有图像的字节被 .Net 框架重新保存为 gif。
  • 请注意,由于某种原因,.Net 看不到它作为调色板图像加载的动画 gif(仅发生在动画 gif 上,尽管它也发生在 some types of png 上),并且在重新保存时说“高色彩”图像转换为调色板格式,它使用标准的 Windows 256 调色板。由于动画 gif 通常具有优化的调色板,这意味着通过此过程保存的任何动画 gif 的质量都会严重下降。所以这个设置绝对不理想;正如 KansaiRobot 的回答所示,最好只读取原始字节。
【解决方案2】:

获取图像的字节数组(byte[])表示,然后使用Convert.ToBase64String(),st。像这样:

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

要将 base64 图像转换回System.Drawing.Image:

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

【讨论】:

  • @Smith,如果您的意思是从 base64 转换回 System.Drawing.Image,您可以使用 st。像这样:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
【解决方案3】:

因为我们大多数人都喜欢 oneliners:

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

如果你需要它作为 Base64 字节数组:

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

【讨论】:

    【解决方案4】:

    这是我为此目的编写的课程:

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

    【讨论】:

      【解决方案5】:

      你可以很方便的传递图片的路径来检索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
      【解决方案6】:

      您可以使用Server.Map 路径提供相对路径,然后您可以使用base64 转换创建图像,也可以将base64 字符串添加到image src。

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

      【讨论】:

        【解决方案7】:

        基于投票最多的答案,针对 C# 8 进行了更新。以下内容可以开箱即用。在Image 之前添加了显式System.Drawing,因为默认情况下可能会使用其他命名空间中的该类。

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

        【讨论】:

        • 您可以用return Convert.ToBase64String(File.ReadAllBytes(path)); 替换整个内容。根本不需要涉及System.Drawing。
        【解决方案8】:

        这样就更简单了,先传图片再传格式。

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

        【讨论】:

          【解决方案9】:

          以下代码对我有用:

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

          【讨论】:

            【解决方案10】:

            对于到达这里的谷歌人来说,这与此相反(没有 SO 问题/答案)

            public static byte[] BytesFromBase64ImageString(string imageData)
            {
                var trunc = imageData.Split(',')[1];
                var padded = trunc.PadRight(trunc.Length + (4 - trunc.Length % 4) % 4, '=');
                return Convert.FromBase64String(padded);
            }
            

            【讨论】:

              【解决方案11】:

              类似的东西

               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
              

              【讨论】:

              • 您注意到问题上的C# 标签了吗?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-09-07
              • 2014-07-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多