其原理就是把獲得倒的數據流序列化到內存中,然後經過加工,在把數據從內存中反序列化出來就行了。
難點就是在如何實現加工。因為Bitmap有一個專有的格式,我們常稱這個格式為數據頭。加工的過程就是要把這個數據頭與我們之前獲得的數據流合並起來。(也就是要把這個頭加入到我們之前獲得的數據流的前面)
那麼這個頭是什麼呢?它是一個固定長度(14個byte)的數據。具體內容見代碼。由於這個頭是對任何Bitmap對象都是通用的,所以加入頭的過程基本上都是一樣的。代碼如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Drawing;
6 using System.IO;
7
8 public Bitmap AddHeader(byte[] imageDataDetails)
9 {
10 Bitmap bitmap = null;
11 int length = imageDataDetails.GetLength(0);
12 using (MemoryStream stream = new MemoryStream(length + 14))//為頭騰出14個長度的空間
13 {
14 byte[] buffer = new byte[13];
15 buffer[0] = 0x42;//Bitmap 固定常數
16 buffer[1] = 0x4d;//Bitmap 固定常數
17 stream.Write(buffer, 0, 2);//先寫入頭的前兩個字節
18
19 //把我們之前獲得的數據流的長度轉換成字節,
20 //這個是用來告訴“頭”我們的實際圖像數據有多大
21 byte[] bytes = BitConverter.GetBytes(length);
22 stream.Write(bytes, 0, 4);//把這個長度寫入頭中去
23 buffer[0] = 0;
24 buffer[1] = 0;
25 buffer[2] = 0;
26 buffer[3] = 0;
27 stream.Write(buffer, 0, 4);//在寫入4個字節長度的數據到頭中去
28 int num2 = 0x36;//Bitmap 固定常數
29 bytes = BitConverter.GetBytes(num2);
30 stream.Write(bytes, 0, 4);//在寫入最後4個字節的長度
31 stream.GetBuffer();
32 stream.Write(imageDataDetails, 0, length);//把實際的圖像數據全部追加到頭的後面
33 bitmap = new Bitmap(stream);//用內存流構造出一幅bitmap的圖片
34 bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);
35 stream.Close();
36 return bitmap;//最後就得到了我們想要的圖片了
37 }
38 }
那麼反過來怎麼實現呢?