[C#參考]byte數組和Image的相互轉換

來源:互聯網
上載者:User

標籤:

功能需求

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的相互轉換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.