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

 更新时间:2026年06月08日 09:57:10   作者:yue008  
这段文章介绍了如何将Base64字符串转换为Image照片的过程,并详细解释了在C#中使用this关键字进行普通实例方法和扩展方法的指代方式,同时提到了MemoryStream在数据转换中的应用场景及其高效性用性,需要的朋友可以参考下

引言

在进行工业相机检测时,经常会遇到将相机拍摄的照片发送到后端,由于发送数据的方式限制,需要将图片转换为Base64字符串,通过HTTP POST 方式发送,后端收到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#如何修改项目名图文详解

    C#如何修改项目名图文详解

    最近开发工作接近尾声,客户来要求更换项目的名称,差不多要变更整个解决方案中项目名称,引用等等,这个工作量还是很大的,这篇文章主要给大家介绍了关于C#如何修改项目名的相关资料,需要的朋友可以参考下
    2023-01-01
  • 深入委托与多播委托的详解

    深入委托与多播委托的详解

    本篇文章是对委托与多播委托进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

    C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

    这篇文章主要介绍了C#实现只运行单个实例应用程序的方法,本文使用的是VB.Net的IsSingleInstance方法实现,优于Mutex 和 Process 这两种只运行单个应用程序实例的方法,需要的朋友可以参考下
    2014-07-07
  • C#自适应合并文件的方法

    C#自适应合并文件的方法

    这篇文章主要介绍了C#自适应合并文件的方法,涉及C#基于FileStream类实现文件读写操作的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • c#系列 list详情

    c#系列 list详情

    这篇文章主要介绍了c#系列 list,list 本质是一个数组,。就跟我们操作系统一样,提前申请内存大小。所以我们程序一般都有一个申请内存,实际使用内存,内存碎片这几个概念,下面俩看文章详细内容吧
    2021-10-10
  • C#实现高性能异步文件下载器详解

    C#实现高性能异步文件下载器详解

    异步文件下载器用处很大,当我们需要实现大文件下载,多任务并行下载等都可以用的上,下面小编就来和大家聊聊如何使用C#实现高性能异步文件下载器吧
    2025-03-03
  • 基于WPF实现步骤控件的示例代码

    基于WPF实现步骤控件的示例代码

    这篇文章主要为大家详细介绍了WPF实现简单的步骤控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2023-01-01
  • C#格式化数字字符串的方法

    C#格式化数字字符串的方法

    这篇文章主要为大家详细介绍了C#格式化数字字符串的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Unity3D手机陀螺仪的使用方法

    Unity3D手机陀螺仪的使用方法

    这篇文章主要为大家详细介绍了Unity3D手机陀螺仪的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C#实现xml文件的读取与写入简单实例

    C#实现xml文件的读取与写入简单实例

    这篇文章主要介绍了C#实现xml文件的读取与写入方法,涉及C#操作XML文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08

最新评论