C#实现Bitmap类型与Byte[]类型相互转化的示例详解

 更新时间:2024年07月10日 09:56:52   作者:白话Learning  
在C#编程中,Bitmap类型和Byte[]类型之间的相互转化是图像处理和数据传输中常见的需求,Bitmap类型表示一个位图图像,而Byte[]类型则是一个字节数组,本文将详细介绍如何在这两种类型之间进行相互转化,需要的朋友可以参考下

前言

在C#编程中,Bitmap类型和Byte[]类型之间的相互转化是图像处理和数据传输中常见的需求。Bitmap类型表示一个位图图像,而Byte[]类型则是一个字节数组,可以用来存储图像数据。有时,我们需要将Bitmap类型转换为Byte[]类型以便进行数据传输或存储,而有时又需要将Byte[]类型转换为Bitmap类型以在客户端显示图像。本文将详细介绍如何在这两种类型之间进行相互转化。

一、Bitmap类型转Byte[]类型

使用Bitmap类的Save方法

Bitmap类的Save方法可以将图像保存到文件,同时将文件内容读取到Byte[]数组中。以下是一个示例:

using System;
using System.IO;
using System.Drawing;

namespace BitmapToByteArray
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个Bitmap对象
            Bitmap bitmap = new Bitmap("example.jpg");

            // 将Bitmap对象保存到文件
            using (FileStream fileStream = new FileStream("example.jpg", FileMode.OpenOrCreate))
            {
                bitmap.Save(fileStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            }

            // 读取文件内容到Byte[]数组
            byte[] bytes = File.ReadAllBytes("example.jpg");

            // 输出Byte[]数组长度
            Console.WriteLine("Byte[]数组长度:" + bytes.Length);

            // 释放资源
            bitmap.Dispose();
        }
    }
}

使用Bitmap类的GetBytes方法

Bitmap类没有直接的方法将自身转换为Byte[],但我们可以使用Bitmap类的GetBytes方法来获取图像的像素数据,然后将其转换为Byte[]数组。以下是一个示例:

using System;
using System.Drawing;
using System.IO;

namespace BitmapToByteArray
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个Bitmap对象
            Bitmap bitmap = new Bitmap("example.jpg");

            // 获取图像的像素数据
            BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                ImageLockMode.ReadOnly, bitmap.PixelFormat);

            // 计算Byte[]数组的大小
            int bytesCount = bitmapData.Stride * bitmapData.Height;
            byte[] bytes = new byte[bytesCount];

            // 将像素数据复制到Byte[]数组
            System.Runtime.InteropServices.Marshal.Copy(bitmapData.Scan0, bytes, 0, bytesCount);

            // 释放资源
            bitmap.UnlockBits(bitmapData);

            // 输出Byte[]数组长度
            Console.WriteLine("Byte[]数组长度:" + bytes.Length);
        }
    }
}

二、Byte[]类型转Bitmap类型

使用MemoryStream将Byte[]数组转换为Bitmap对象

通过MemoryStream,我们可以将Byte[]数组重新构造为Bitmap对象。以下是一个示例:

using System;
using System.Drawing;
using System.IO;

namespace ByteArrayToBitmap
{
    class Program
    {
        static void Main(string[] args)
        {
            // 读取Byte[]数组
            byte[] bytes = File.ReadAllBytes("example.jpg");

            // 使用MemoryStream将Byte[]数组转换为Bitmap对象
            using (MemoryStream memoryStream = new MemoryStream(bytes))
            {
                Bitmap bitmap = new Bitmap(memoryStream);

                // 输出Bitmap对象的信息
                Console.WriteLine("图像宽度:" + bitmap.Width);
                Console.WriteLine("图像高度:" + bitmap.Height);

                // 释放资源
                bitmap.Dispose();
            }
        }
    }
}

使用System.Drawing.Imaging.BitmapImage类

System.Drawing.Imaging.BitmapImage类提供了一种从Byte[]数组创建Bitmap对象的方法。以下是一个示例:

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace ByteArrayToBitmap
{
    class Program
    {
        static void Main(string[] args)
        {
         {
            // 读取Byte[]数组
            byte[] bytes = File.ReadAllBytes("example.jpg");

            // 使用System.Drawing.Imaging.BitmapImage类创建Bitmap对象
            Bitmap bitmap = new Bitmap(bytes);

            // 输出Bitmap对象的信息
            Console.WriteLine("图像宽度:" + bitmap.Width);
            Console.WriteLine("图像高度:" + bitmap.Height);

            // 释放资源
            bitmap.Dispose();
        }
    }
}

在这段代码中,我们首先读取了一个名为"example.jpg"的JPEG图像文件的内容,并将其存储在Byte[]数组中。然后,我们使用Bitmap类构造函数,将Byte[]数组作为参数传递,创建了一个新的Bitmap对象。最后,我们输出了新创建的Bitmap对象的宽度和高度信息,并释放了资源。

注意: 在上面的示例中,我们使用了File.ReadAllBytes方法来读取文件内容。如果你需要处理其他格式的图像文件,你可能需要使用不同的方法来读取文件内容,例如使用System.IO.FileStream类。

总结

在C#中,Bitmap类型和Byte[]类型之间的相互转化可以通过使用Save方法、GetBytes方法、MemoryStream和BitmapImage类来实现。这些方法可以满足图像处理中的常见需求,例如将图像保存到文件、从文件读取图像内容,或者在网络传输中将图像数据转换为Byte[]数组。

以上就是C#实现Bitmap类型与Byte[]类型相互转化的示例详解的详细内容,更多关于C# Bitmap与Byte[]相互转化的资料请关注脚本之家其它相关文章!

相关文章

  • C# 改变无边框窗体尺寸大小的方法

    C# 改变无边框窗体尺寸大小的方法

    这篇文章介绍了C# 改变无边框窗体尺寸大小的方法,有需要的朋友可以参考一下
    2013-10-10
  • C#中一个方法返回多个值的实现方法小结

    C#中一个方法返回多个值的实现方法小结

    通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回,因此本文给大家介绍了C#中一个方法返回多个值的实现方法及示例代码,需要的朋友可以参考下
    2024-05-05
  • C#之线程同步Mutex类方式

    C#之线程同步Mutex类方式

    这篇文章主要介绍了C#之线程同步Mutex类方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • C#实现简单串口通信的示例详解

    C#实现简单串口通信的示例详解

    这篇文章主要为大家详细介绍了C#实现串口通信的相关知识,文中示例代码介绍的非常详细,具有一定的学习价值,感兴趣的小伙伴们可以跟随小编一起了解一下
    2023-10-10
  • Unity UGUI的EventTrigger事件监听器组件介绍使用示例

    Unity UGUI的EventTrigger事件监听器组件介绍使用示例

    这篇文章主要为大家介绍了Unity UGUI的EventTrigger事件监听器组件介绍及使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • C# 使用Dapper与金仓数据库交互的实现步骤

    C# 使用Dapper与金仓数据库交互的实现步骤

    本文主要介绍了C# 使用 Dapper 与金仓数据库交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • C#使用Free Spire.Doc读取Word内容的详细步骤

    C#使用Free Spire.Doc读取Word内容的详细步骤

    在日常开发中,处理Word文档的需求并不少见,从提取合同条款到解析报告数据,手动操作效率低且易出错,传统方案依赖COM组件或付费库,但读取Word文本的轻量级需求却常被忽视,本文将围绕如何用免费的Free Spire.Doc for .NET实现Word内容提取,需要的朋友可以参考下
    2025-09-09
  • 浅谈C#中字符串是不可变的吗

    浅谈C#中字符串是不可变的吗

    C#字符串不可变,创建后内容不可修改,这样设计保障了线程安全、哈希性能和安全性,同时简化状态管理,使用StringBuilder等方式可提升操作效率,理解不可变性有助于编写高效、安全的代码
    2025-10-10
  • 详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿

    详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿

    本文主要介绍了C#中 Thread,Task,Async/Await,IAsyncResult的相关知识。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • C#影院售票系统毕业设计(3)

    C#影院售票系统毕业设计(3)

    这篇文章介绍了C#影院售票系统毕业设计,文章主要内容是关于购票、座位颜色状态的改变及场次座位状态的显示,需要的朋友可以参考下
    2015-11-11

最新评论