C Sharp实现Base64字符串和Image图片相互转换

作者:袖梨 2026-06-09

引言

在进行工业相机检测时,经常会遇到将相机拍摄的照片发送到后端,由于发送数据的方式限制,需要将图片转换为Base64字符串,通过HTTP POST 方式发送,后端收到Base64字符串后,再转换为image格式显示。

C#实现Base64字符串和Image图片相互转换

知识点

this

this在C#一般有两种用法。1、指代当前对象本身。2、要扩展的目标类型

位置

写法

含义

普通实例方法中

this.Name = name;

指代当前对象本身

扩展方法的第一个参数

this string base64str

表示要扩展的目标类型

// 普通用法:this 指当前实例
class Person
{
    private string name;
    public void SetName(string name)
    {
        this.name = name;  // this 指当前 Person 对象
    }
}
// 扩展方法:this 标记目标类型
public static class ImageExtensions
{
    public static Image Base64ToImage(this string base64str)  // 扩展 string 类型
    {
        // 这里的 this 不是指对象,而是语法标记
    }
}

对于扩展方法,其实是为了方便调用。

public static class StringExtensions//类必须是静态
{
  public static Image Base64ToImage(this string base64str)  // 方法必须是静态的
  {
   byte[] imageBytes = Convert.FormBase64String(base64str)
  using(MemoryStream ms = new MemoryStream(imageBytes))
  {
      return Image.FromStream(ms);
   }
  }
}
//使用时,就像string原生就有这个方法一样
string myBase64 = "asdadadaasd";
Image img = myBase64.Base64ToImage();

其实可用理解扩展方法就是语法糖,对于其使用,具有以下几个规则。类必须是静态的,方法也必须是静态的,第一个参数必须是this,只能有一个this参数。

另外也可以对自定义的类进行方法扩展。

public class IoDevice
{
  public int IoNo{get;set;}
  public bool IsOpen{get;set;}
}
public static class IoDeviceExt
{
  public static string GetStatusText(this IoDevice device)
  {
    return device.IsOpen? $"IO{device.IoNo}已导通":$"IO{device.IoNo}断开"
  }
  public static Color GetStatusColor(this IoDevice device)
  {
    return device.IsOpen?Color.Green:Color.Red
  }
}
IoDevice io = new IoDevice
{
    IoNo = 5,
    IsOpen = true
};
// 自定义扩展方法
string txt = io.GetStatusText();
Color color = io.GetStatusColor();

给 List<T> 自定义扩展

public static class ListExt
{
    // 批量判断:是否全部IO为关闭
    public static bool AllIoClose(this List<bool> ioList)
    {
        return ioList.All(x => x == false);
    }
    // 获取导通的IO数量
    public static int GetOpenIoCount(this List<bool> ioList)
    {
        return ioList.Count(x => x);
    }
}
List<bool> IOAddress = new List<bool>();
bool allClose = IOAddress.AllIoClose();
int openNum = IOAddress.GetOpenIoCount();

MemoryStream

内存中的虚拟文件,正常情况下,文件是保存在硬盘上,比如我们常见的带各种后缀的文件,xx.txt文件等等,内存流可以理解为存在内存里,没有真实物理文件,没有路径,不写在硬盘。常见场景有:

二进制字节数组 → 写入内存流 → 再读取 / 转成图片、文件、格式转换

在本项目中,需要将Base64转换为以Byte为单位的字节数组,然后将字节数组放到内存虚拟文件中,最后从内存流中读取,生成image照片

// 1.Base64 → 字节数组(原始图片二进制数据)
byte[] imageBytes = Convert.FromBase64String(base64str);
// 2.把字节数组放进【内存虚拟文件】
MemoryStream ms = new MemoryStream(imageBytes);
// 3.从内存流读取,生成Image图片
Image.FromStream(ms);

其实你可以理解MemoryStream是一个中转站,适合临时转换数据。而且快速高效。

功能代码

Base64转换Image

  public static  class ExtensionCls
 {
     public static Image Base64ToImage(this string base64str)
     {
         if(string.IsNullOrWhiteSpace(base64str))
         {
             return null;
         }
         try
         {
             if(base64str.Contains(","))
             {
                 base64str = base64str.Split(",")[1];
             }
             byte[] imagebytes = Convert.FromBase64String(base64str);
             MemoryStream ms = new MemoryStream(imagebytes);
             Image image = Image.FromStream(ms);
             return image;
         }
         catch
         {
             return null;
         }
     }
 }

ImageToBase64

public static string ImageToBase64(this Image image)
{
    // 1. 图片为空直接返回空字符串
    if (image == null)
        return string.Empty;
    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            // 2. 强制保存为 PNG(最稳定、不报错、兼容所有图片)
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            // 3. 转字节数组 → Base64
            byte[] imageBytes = ms.ToArray();
            return Convert.ToBase64String(imageBytes);
        }
    }
    catch
    {
        // 4. 失败返回空,程序不崩溃
        return string.Empty;
    }
}

以上就是C#实现Base64字符串和Image图片相互转换的详细内容,更多关于C# Base64字符串和Image图片互转的资料请关注本站其它相关文章!

您可能感兴趣的文章:
  • C#中图片的Base64编码与解码转换详解
  • C#实现文件与Base64的相互转换
  • C#之关于Base64简单加密与解密方式
  • C#实现Base64编码与解码及规则
  • c# base64转字符串实例

相关文章

精彩推荐