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

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();
内存中的虚拟文件,正常情况下,文件是保存在硬盘上,比如我们常见的带各种后缀的文件,xx.txt文件等等,内存流可以理解为存在内存里,没有真实物理文件,没有路径,不写在硬盘。常见场景有:
二进制字节数组 → 写入内存流 → 再读取 / 转成图片、文件、格式转换
在本项目中,需要将Base64转换为以Byte为单位的字节数组,然后将字节数组放到内存虚拟文件中,最后从内存流中读取,生成image照片
// 1.Base64 → 字节数组(原始图片二进制数据) byte[] imageBytes = Convert.FromBase64String(base64str); // 2.把字节数组放进【内存虚拟文件】 MemoryStream ms = new MemoryStream(imageBytes); // 3.从内存流读取,生成Image图片 Image.FromStream(ms);
其实你可以理解MemoryStream是一个中转站,适合临时转换数据。而且快速高效。
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;
}
}
}
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图片互转的资料请关注本站其它相关文章!
您可能感兴趣的文章: