C# 中字节流与图片互转的实用方法

林见深
林见深
发布时间:2026-10-14 | 3人浏览过
原创

本文介绍了在 C# 环境下利用 System.Drawing 和 System.IO 实现图像对象与字节数组相互转换的方法。核心逻辑包括使用 MemoryStream 暂存编码后的图片数据,以及通过构造函数将字节流还原为可视图像。

实现原理与目标

将图片(Image)转化为字节流(byte[]),通常是为了在网络传输、数据库二进制字段存储或内存操作中使用。反之,将字节流转回图片则是为了在前端展示或后端进一步处理图像数据。主要依赖 .NET 框架中的 System.Drawing.Image 类及流处理机制。

准备条件

在编写代码前,确保项目中已引入必要的命名空间:

  • using System;
  • using System.Drawing;
  • using System.Drawing.Imaging;
  • using System.IO;

如果是 ASP.NET 项目,请确认已添加对 System.Drawing.Common 的引用;若为 WPF 项目,推荐使用 System.Windows.Media 替代方案,因为 System.Drawing 是 Windows Forms 相关的底层 GDI+ 封装。

第1步:将图片转换为字节流

此步骤的主要目的是获取图像数据的原始二进制表示。虽然可以直接读取文件内容,但在代码对象层面进行转换更为灵活。

具体动作:使用 MemoryStream 保存图像

目的:创建一个内存缓冲区,将图片按指定格式编码写入其中。
入口:一个有效的 Image 对象实例。
参数:目标编码格式,此处以 JPEG 为例(ImageFormat.Jpeg)。

public static byte[] ImgToByt(Image img)
{
    // 创建内存流作为临时容器
    using (MemoryStream ms = new MemoryStream())
    {
        // 将图片保存至内存流,指定编码格式
        // 注意:不使用默认格式可控制文件大小和质量
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        
        // 获取内存流的字节数组
        // 如果后续需要精确长度而非容量,可使用 ms.ToArray()
        return ms.GetBuffer();
    }
}

重要提示:GetBuffer() 返回的是内部缓冲区的字节,其长度可能大于实际数据长度。如果需要严格对应有效数据的数组,建议改用 ms.ToArray()。上述代码保留了原文使用的 GetBuffer() 方法,但在生产环境中请注意潜在的尾部空字节问题。

辅助方法:根据路径直接获取字节

当手头只有图片文件路径时,可以使用 FileStream 直接读取:

private static byte[] GetImageByte(string imagePath)
{
    using (FileStream fs = new FileStream(imagePath, FileMode.Open))
    {
        byte[] imgByte = new byte[fs.Length];
        fs.Read(imgByte, 0, Convert.ToInt32(fs.Length));
        return imgByte;
    }
}

第2步:将字节流转回图片

此步骤用于接收到的二进制数据进行解码渲染。

具体动作:通过流初始化 Image

目的:让图形库识别字节流中的图像头信息并生成对象。
入口:包含有效图像数据的 byte[] 数组。
动作:创建指向该数据的流,并调用 Image.FromStream。

public static Image BytToImg(byte[] byt)
{
    // 将字节数组包装为内存流
    using (MemoryStream ms = new MemoryStream(byt))
    {
        // 从流中创建图像对象
        Image img = Image.FromStream(ms);
        return img;
    }
}

完成判断与注意事项

  1. 资源释放:Image 对象及其底层的 Graphics 句柄是非托管资源。在实际应用中,建议在 try...finally 块或 using 语句结束后,显式调用 Dispose() 以防内存泄漏。
  2. 编码兼容性:ImgToByt 强制使用了 JPEG 格式。如果被传入的 Image 包含 Alpha 通道(透明度),JPEG 格式会丢失透明信息并填充背景色。如需保留透明度,应更换为 Png 格式。
  3. 线程安全:System.Drawing 在多线程环境下并不总是安全的,并发调用可能导致不可预知的异常,建议加锁或在不同进程中处理。

总结

通过 System.Drawing 提供的流处理能力,我们可以便捷地完成 C# 程序中的数据序列化工作。掌握 MemoryStream 的使用是解决此类问题的关键。以上就是 C# 将字节流与图片相互转换的详细内容,更多关于 C# 图像处理与文件操作的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表