C#實(shí)現(xiàn)Bitmap類型與Byte[]類型相互轉(zhuǎn)化的示例詳解
前言
在C#編程中,Bitmap類型和Byte[]類型之間的相互轉(zhuǎn)化是圖像處理和數(shù)據(jù)傳輸中常見的需求。Bitmap類型表示一個位圖圖像,而Byte[]類型則是一個字節(jié)數(shù)組,可以用來存儲圖像數(shù)據(jù)。有時,我們需要將Bitmap類型轉(zhuǎn)換為Byte[]類型以便進(jìn)行數(shù)據(jù)傳輸或存儲,而有時又需要將Byte[]類型轉(zhuǎn)換為Bitmap類型以在客戶端顯示圖像。本文將詳細(xì)介紹如何在這兩種類型之間進(jìn)行相互轉(zhuǎn)化。
一、Bitmap類型轉(zhuǎn)Byte[]類型
使用Bitmap類的Save方法
Bitmap類的Save方法可以將圖像保存到文件,同時將文件內(nèi)容讀取到Byte[]數(shù)組中。以下是一個示例:
using System; using System.IO; using System.Drawing; namespace BitmapToByteArray { class Program { static void Main(string[] args) { // 創(chuàng)建一個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); } // 讀取文件內(nèi)容到Byte[]數(shù)組 byte[] bytes = File.ReadAllBytes("example.jpg"); // 輸出Byte[]數(shù)組長度 Console.WriteLine("Byte[]數(shù)組長度:" + bytes.Length); // 釋放資源 bitmap.Dispose(); } } }
使用Bitmap類的GetBytes方法
Bitmap類沒有直接的方法將自身轉(zhuǎn)換為Byte[],但我們可以使用Bitmap類的GetBytes方法來獲取圖像的像素數(shù)據(jù),然后將其轉(zhuǎn)換為Byte[]數(shù)組。以下是一個示例:
using System; using System.Drawing; using System.IO; namespace BitmapToByteArray { class Program { static void Main(string[] args) { // 創(chuàng)建一個Bitmap對象 Bitmap bitmap = new Bitmap("example.jpg"); // 獲取圖像的像素數(shù)據(jù) BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); // 計算Byte[]數(shù)組的大小 int bytesCount = bitmapData.Stride * bitmapData.Height; byte[] bytes = new byte[bytesCount]; // 將像素數(shù)據(jù)復(fù)制到Byte[]數(shù)組 System.Runtime.InteropServices.Marshal.Copy(bitmapData.Scan0, bytes, 0, bytesCount); // 釋放資源 bitmap.UnlockBits(bitmapData); // 輸出Byte[]數(shù)組長度 Console.WriteLine("Byte[]數(shù)組長度:" + bytes.Length); } } }
二、Byte[]類型轉(zhuǎn)Bitmap類型
使用MemoryStream將Byte[]數(shù)組轉(zhuǎn)換為Bitmap對象
通過MemoryStream,我們可以將Byte[]數(shù)組重新構(gòu)造為Bitmap對象。以下是一個示例:
using System; using System.Drawing; using System.IO; namespace ByteArrayToBitmap { class Program { static void Main(string[] args) { // 讀取Byte[]數(shù)組 byte[] bytes = File.ReadAllBytes("example.jpg"); // 使用MemoryStream將Byte[]數(shù)組轉(zhuǎn)換為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[]數(shù)組創(chuàng)建Bitmap對象的方法。以下是一個示例:
using System; using System.Drawing; using System.Drawing.Imaging; namespace ByteArrayToBitmap { class Program { static void Main(string[] args) { { // 讀取Byte[]數(shù)組 byte[] bytes = File.ReadAllBytes("example.jpg"); // 使用System.Drawing.Imaging.BitmapImage類創(chuàng)建Bitmap對象 Bitmap bitmap = new Bitmap(bytes); // 輸出Bitmap對象的信息 Console.WriteLine("圖像寬度:" + bitmap.Width); Console.WriteLine("圖像高度:" + bitmap.Height); // 釋放資源 bitmap.Dispose(); } } }
在這段代碼中,我們首先讀取了一個名為"example.jpg"的JPEG圖像文件的內(nèi)容,并將其存儲在Byte[]數(shù)組中。然后,我們使用Bitmap類構(gòu)造函數(shù),將Byte[]數(shù)組作為參數(shù)傳遞,創(chuàng)建了一個新的Bitmap對象。最后,我們輸出了新創(chuàng)建的Bitmap對象的寬度和高度信息,并釋放了資源。
注意: 在上面的示例中,我們使用了File.ReadAllBytes方法來讀取文件內(nèi)容。如果你需要處理其他格式的圖像文件,你可能需要使用不同的方法來讀取文件內(nèi)容,例如使用System.IO.FileStream類。
總結(jié)
在C#中,Bitmap類型和Byte[]類型之間的相互轉(zhuǎn)化可以通過使用Save方法、GetBytes方法、MemoryStream和BitmapImage類來實(shí)現(xiàn)。這些方法可以滿足圖像處理中的常見需求,例如將圖像保存到文件、從文件讀取圖像內(nèi)容,或者在網(wǎng)絡(luò)傳輸中將圖像數(shù)據(jù)轉(zhuǎn)換為Byte[]數(shù)組。
以上就是C#實(shí)現(xiàn)Bitmap類型與Byte[]類型相互轉(zhuǎn)化的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C# Bitmap與Byte[]相互轉(zhuǎn)化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 9 新特性——record的相關(guān)總結(jié)
這篇文章主要介紹了C# 9 新特性——record的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用c# 9的新特性,感興趣的朋友可以了解下2021-02-02Unity中使用反射機(jī)制調(diào)用函數(shù)
這篇文章主要為大家詳細(xì)介紹了Unity中使用反射機(jī)制調(diào)用函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-03-03C#實(shí)現(xiàn)批量更改文件名稱大小寫或擴(kuò)展名
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)批量更改文件名稱大小寫或擴(kuò)展名的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12C#怎么實(shí)現(xiàn)手機(jī)短信發(fā)送功能
為了個人信息的安全,很多網(wǎng)站都有短信發(fā)送的功能,究竟是怎么實(shí)現(xiàn)的呢?對于個人站長來說的話,通過使用sms短信通知api接口相對比較簡單,下面小編給大家介紹具體實(shí)現(xiàn)過程,對c#怎么實(shí)現(xiàn)手機(jī)短信發(fā)送功能感興趣的朋友一起學(xué)習(xí)吧2015-12-12asp.net實(shí)現(xiàn)遍歷Request的信息操作示例
這篇文章主要介紹了asp.net實(shí)現(xiàn)遍歷Request的信息操作,涉及asp.net針對請求信息相關(guān)操作打印操作技巧,需要的朋友可以參考下2020-03-03C#中實(shí)現(xiàn)向數(shù)組中動態(tài)添加元素
這篇文章主要介紹了C#中實(shí)現(xiàn)向數(shù)組中動態(tài)添加元素方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06WPF仿Tabcontrol實(shí)現(xiàn)切換多個不同View
這篇文章主要為大家詳細(xì)介紹了WPF如何模仿Tabcontrol實(shí)現(xiàn)切換多個不同View,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11