当前位置: 首页 > news >正文

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

文章目录

  • 一、Bitmap类型转Byte[]类型
    • 使用Bitmap类的Save方法
    • 使用Bitmap类的GetBytes方法
  • 二、Byte[]类型转Bitmap类型
    • 使用MemoryStream将Byte[]数组转换为Bitmap对象
    • 使用System.Drawing.Imaging.BitmapImage类
  • 总结

在这里插入图片描述


在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[]数组。

相关文章:

  • 需求分析|泳道图 ProcessOn教学
  • Games101——光珊化——深度缓存——shading着色 1
  • 旷野之间3 – CTO 应具备的技能
  • 【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】
  • 记一次mysql导出到达梦数据库
  • 8.5结构体嵌套结构体
  • ONNX加载模型问题总结
  • 筛斗数据:数据提取技术,驱动业务增长的新引擎
  • 人工智能+影像组学的交叉课题,患者的临床特征如何收集与整理|顶刊专题汇总·24-07-10
  • ChatGPT 5.0:一年后的猜想
  • 为何Expo成为React Native官方推荐框架?
  • 连续6年夺冠 6项细分领域第一,中电金信持续领跑中国银行业IT解决方案市场
  • python学习-类
  • 小程序开发页面获取小程序assess文件夹下所有图片
  • 网络服务器都包含哪些方面需要维护?
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 2017 前端面试准备 - 收藏集 - 掘金
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 内存分配及垃圾回收机制初探
  • php ci框架整合银盛支付
  • PHP 小技巧
  • vagrant 添加本地 box 安装 laravel homestead
  • WePY 在小程序性能调优上做出的探究
  • 彻底搞懂浏览器Event-loop
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 观察者模式实现非直接耦合
  • 使用权重正则化较少模型过拟合
  • 微服务框架lagom
  • !$boo在php中什么意思,php前戏
  • (9)目标检测_SSD的原理
  • (C语言)逆序输出字符串
  • (ros//EnvironmentVariables)ros环境变量
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (三)终结任务
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十二)Flink Table API
  • (十三)Flask之特殊装饰器详解
  • (一)RocketMQ初步认识
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (一一四)第九章编程练习
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)socket Aio demo
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net6Api后台+uniapp导出Excel
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Pointcut 使用
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [.NET 即时通信SignalR] 认识SignalR (一)