成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析C#byte數組轉化成圖像的實現

開發 后端
C#byte數組轉化成圖像的實現是如何辦到的呢?C# byte數組轉換為8bit灰度圖像的具體操作是什么呢?那么本文就向你介紹這方面的內容。

C# byte數組轉換為8bit灰度圖像的問題類似的文章在網上可以看到不少,但多多少少都存在一些問題。這兩天做實驗室的項目用到這個功能,我從頭把它整理了一遍。在看代碼之前,首先解釋幾個問題。

1、byte數組存放的是圖像每個像素的灰度值,byte類型正好是從0~255,存放8bit灰度圖像的時候,一個數組元素就是一個像素的灰度值。僅有這個數組還不足以恢復出原來的圖像,還必須事先知道圖像的長、寬值;

2、創建Bitmap類的時候必須指定PixelFormat為Format8bppIndexed,這樣才***圖像本身的特性;

3、Bitmap類雖然提供了GetPixel()、SetPixel()這樣的方法,但我們絕對不能用這兩個方法來進行大規模的像素讀寫,因為它們的性能實在很囧;

4、托管代碼中,能不用unsafe就盡量不用。在.NET 2.0中已經提供了BitmapData類及其LockBits()、UnLockBits()操作,能夠安全地進行內存讀寫;
 
5、圖像的width和它存儲時的stride是不一樣的。位圖的掃描線寬度一定是4的倍數,因此圖像在內存中的大小并不是它的顯示大小;

6、Format8bppIndexed類型的PixelFormat是索引格式,其調色板并不是灰度的而是偽彩,因此需要我們對其加以修改。

代碼如下,解說寫在注釋里了:

  1. /// <summary>  
  2. /// 將一個字節數組轉換為8bit灰度位圖  
  3. /// </summary>  
  4. /// <param name="rawValues">顯示字節數組</param>  
  5. /// <param name="width">圖像寬度</param>  
  6. /// <param name="height">圖像高度</param>  
  7. /// <returns>位圖</returns>  
  8. public static Bitmap ToGrayBitmap(byte[] rawValues, int width, int height)  
  9. {  
  10. //// 申請目標位圖的變量,并將其內存區域鎖定  
  11. Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);  
  12. BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, width, height),  
  13.  ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);  
  14.  
  15. //// 獲取圖像參數  
  16. int stride = bmpData.Stride;  // 掃描線的寬度  
  17. int offset = stride - width;  // 顯示寬度與掃描線寬度的間隙  
  18. IntPtr iptr = bmpData.Scan0;  // 獲取bmpData的內存起始位置  
  19. int scanBytes = stride * height;// 用stride寬度,表示這是內存區域的大小  
  20.  
  21. //// 下面把原始的顯示大小字節數組轉換為內存中實際存放的字節數組  
  22. int posScan = 0, posReal = 0;// 分別設置兩個位置指針,指向源數組和目標數組  
  23. byte[] pixelValues = new byte[scanBytes];  //為目標數組分配內存  
  24.  
  25.   for (int x = 0; x < height; x++)  
  26. {  
  27.  //// 下面的循環節是模擬行掃描  
  28.  for (int y = 0; y < width; y++)  
  29.  {  
  30.  pixelValues[posScan++] = rawValues[posReal++];  
  31.  }  
  32.  posScan += offset;  //行掃描結束,要將目標位置指針移過那段“間隙”  
  33. }  
  34.    
  35. //// 用Marshal的Copy方法,將剛才得到的內存字節數組復制到BitmapData中  
  36. System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, iptr, scanBytes);  
  37. bmp.UnlockBits(bmpData);  // 解鎖內存區域  
  38.    
  39. //// 下面的代碼是為了修改生成位圖的索引表,從偽彩修改為灰度  
  40. ColorPalette tempPalette;  
  41. using (Bitmap tempBmp = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))  
  42. {  
  43.  tempPalette = tempBmp.Palette;  
  44. }  
  45. for (int i = 0; i < 256; i++)  
  46. {  
  47.  tempPalette.Entries[i] = Color.FromArgb(i, i, i);  
  48. }  
  49.  
  50. bmp.Palette = tempPalette;  
  51.    
  52. //// 算法到此結束,返回結果  
  53. return bmp;  
  54. }  

下面是我用來測試的代碼片段:

  1.   static void Main(string[] args)  
  2.   {  
  3.   byte[] bytes = new byte[10000];  
  4.   int k = 0;  
  5.  
  6.   for (int i = 0; i < 100; i++)  
  7.   {  
  8. for (int j = 0; j < 100; j++)  
  9. {  
  10. bytes[k++] = (byte)(i + j);  
  11. }  
  12.   }  
  13.  
  14.   Bitmap bmp = ToGrayBitmap(bytes, 100, 100);  
  15.  
  16.   bmp.Save(@"d:\test.png",   
  17.  
  18. System.Drawing.Imaging.ImageFormat.Png);  
  19.   }  

結果應該顯示成下面的樣子:

C#byte數組轉化成圖像 

如果沒有修改過調色板,則會顯示出下面的色彩斑斕的圖像:

C#byte數組轉化成圖像 

C#byte數組轉化成圖像的相關內容就向你介紹到這里,希望對你了解和學習C#byte數組轉化成圖像有所幫助。

【編輯推薦】

  1. C#靜態方法應用實例詳解
  2. C#反射概念以及實例詳解
  3. C#反射命名空間淺析
  4. C#靜態類和靜態類成員詳解
  5. C# byte數組常用擴展淺析
責任編輯:仲衡 來源: 博客園
相關推薦

2009-08-28 14:25:57

C# byte數組

2009-08-13 13:03:52

C#結構體數組

2010-03-30 16:56:01

Oracle函數

2018-10-19 05:03:25

2015-06-05 11:24:17

WPS金山軟件

2014-03-19 10:44:51

Linuxpng圖片

2011-09-07 15:38:33

Ubuntuccd2isonrg2iso

2021-06-11 21:46:31

RocketMQ數據JSON

2010-08-02 10:35:19

Flex3教程

2017-07-25 15:09:48

Linux地址轉化

2010-07-01 12:09:46

UML類圖

2021-10-08 13:45:23

大數據數據科學家貨幣

2024-09-26 09:12:35

vueOCR前端

2009-08-26 13:07:07

C#交錯數組

2010-01-20 10:19:55

C++數組

2009-08-06 10:14:15

C#引用類型數組

2009-08-07 13:39:13

C#定義整型數組

2022-07-05 10:09:18

exceljson文件

2009-09-23 09:36:34

C#數組

2009-09-02 10:58:02

C#動態數組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲福利一区 | 亚洲第一区久久 | 欧美午夜影院 | 亚洲自拍偷拍免费视频 | 国产精品大片 | 亚洲最大av网站 | 欧美视频网 | 精品婷婷 | 成人国产精品免费观看 | 91精品国产91久久久久游泳池 | 怡红院成人在线视频 | 91久久综合 | 中文字幕久久久 | 久久久久久久久国产成人免费 | 麻豆久久精品 | 亚洲国产成人精品女人久久久 | 日韩av成人在线 | 久久最新 | 久久久久久免费看 | 久久久久久久久久久福利观看 | 亚洲 欧美 日韩在线 | 久久久久久成人 | 亚洲精品在线国产 | 成人a网 | 久草院线 | 91视频在线看| 野狼在线社区2017入口 | 久久97精品| 一区二区视频在线 | 国偷自产av一区二区三区 | 欧美一级二级在线观看 | 龙珠z在线观看 | 一区二区三区国产好的精 | 91精品在线看 | 国产精品99久久久久久动医院 | 青草福利 | 国产最新视频在线 | 国产成人免费视频网站高清观看视频 | 91视频.com | 日韩亚洲视频在线 | 精品国产一区二区三区久久久久久 |