標籤:
功能需求
1、把一張圖片(png bmp jpeg bmp gif)轉換為byte數組在記憶體中操作。
2、把記憶體中的byte數群組轉換成Image對象,賦值給相應的控制項顯示。
3、從圖片byte數組得到對應的圖片格式,產生一張圖片儲存到磁碟中。
這個的Image是System.Drawing.Image。
//Get an image from fileImage image = Image.FromFile("D:\\test.jpg");Bitmap bitmap = new Bitmap("D:\\test.jpg");
一下三個函數分別實現了上述三個需求:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Drawing.Imaging;using System.Drawing;using System.IO;namespace NetUtilityLib{ public class ImageHelper { /// <summary> /// Convert Image to Byte[] /// </summary> /// <param name="image"></param> /// <returns></returns> public static byte[] ImageToBytes(Image image) { ImageFormat format = image.RawFormat; using (MemoryStream ms = new MemoryStream()) { //複雜一點的判斷 //if(format.Equals(ImageFormat.Jpeg)) //{ // image.Save(ms, ImageFormat.Jpeg); //} //else if (format.Equals(ImageFormat.Png)) //{ // image.Save(ms, ImageFormat.Png); //} //else if(format.Equals(ImageFormat.Bmp)) //{ // image.Save(ms, ImageFormat.Bmp); //} //else if (format.Equals(ImageFormat.Gif)) //{ // image.Save(ms, ImageFormat.Gif); //} //else if (format.Equals(ImageFormat.Icon)) //{ // image.Save(ms, ImageFormat.Icon); //} //直接搞定 image.Save(ms, format); byte[] buffer = new byte[ms.Length]; //Image.Save()會改變MemoryStream的Position,需要重新Seek到Begin也就是開始的0位置 ms.Seek(0, SeekOrigin.Begin); ms.Read(buffer, 0, buffer.Length); return buffer; }//using }//ImageToBytes /// <summary> /// Convert Byte[] to Image /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static Image BytesToImage(byte[] buffer) { MemoryStream ms = new MemoryStream(buffer); Image image = Image.FromStream(ms); return image; }//BytesToImage /// <summary> /// Convert Byte[] to a picture and Store it in file /// </summary> /// <param name="fileName"></param> /// <param name="buffer"></param> /// <returns></returns> public static string CreateImageFromBytes(string fileName, byte[] buffer) { //擷取圖片的格式 Image image = BytesToImage(buffer); ImageFormat format = image.RawFormat; //根據格式,設定尾碼 if (format.Equals(ImageFormat.Jpeg)) { fileName += ".jpeg"; } else if (format.Equals(ImageFormat.Png)) { fileName += ".png"; } else if (format.Equals(ImageFormat.Bmp)) { fileName += ".bmp"; } else if (format.Equals(ImageFormat.Gif)) { fileName += ".gif"; } else if (format.Equals(ImageFormat.Icon)) { fileName += ".icon"; } //建立檔案目錄 FileInfo info = new FileInfo(fileName); Directory.CreateDirectory(info.Directory.FullName); //把數組寫到指定的位置 File.WriteAllBytes(fileName, buffer); return fileName; }//CreateImageFromBytes }}
做一些介紹
Stream流類
流是 位元組序列的抽象,這些位元組可能來自與檔案、TCP/IP通訊端或記憶體。在.NET中,通過 Stream類適當地表示流。Stream類提供了位元組序列的通用視圖。
Stream類是其他所有流的基類,並且有如下的類實現:
- BufferedStream:提供另一個流上的緩衝層以改進效能
- FileStream:提供讀寫檔案的方法
- MemoryStream:提供使用記憶體作為備份存放區器的流
- NetworkStream:提供訪問網路上的資料的方法
- CryptoStream:提供供應加密變換資料的方法
本博文中主要用到了MemoryStream,所以只對其做介紹,其他的在參考文章連結中。
有時需要在記憶體中操作資料,而不是採取將這些資料儲存在檔案中的方式,相應的樣本是WindowsForm中的PictrueBox控制項。例如 ,你有一張顯示在PictureBox控制項中的圖片,並且希望將圖片發送到遠程伺服器,例如Web Service.PictureBox控制項有一個Save()方法,通過該方法可以將映像儲存到Stream對象。
相比於將映像儲存到FileStream對象,然後將該檔案中的資料重新載入到位元組數組中,更好的方法是使用MemoryStream對象,該對象使用記憶體作為備份存放區器(相比於執行檔案I/O,使用記憶體更為有效;檔案I/O的執行速度相對緩慢)。
Image.Save方法
Image.Save 方法 (Stream, ImageFormat)
這個方法將映像以指定的格式儲存到指定的流中。映像必須儲存到零位移量的流中。 如果在儲存映像之前已經將任何附加資料寫入到流,則流中的映像資料會損壞。
參考資料
Stream流類連結:http://blog.csdn.net/gengkunpeng/article/details/5797231
[C#參考]byte數組和Image的相互轉換