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

淺析C#byte數(shù)組轉化成圖像的實現(xiàn)

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

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

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

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

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

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

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

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

  1. /// <summary>  
  2. /// 將一個字節(jié)數(shù)組轉換為8bit灰度位圖  
  3. /// </summary>  
  4. /// <param name="rawValues">顯示字節(jié)數(shù)組</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. //// 申請目標位圖的變量,并將其內(nèi)存區(qū)域鎖定  
  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. //// 獲取圖像參數(shù)  
  16. int stride = bmpData.Stride;  // 掃描線的寬度  
  17. int offset = stride - width;  // 顯示寬度與掃描線寬度的間隙  
  18. IntPtr iptr = bmpData.Scan0;  // 獲取bmpData的內(nèi)存起始位置  
  19. int scanBytes = stride * height;// 用stride寬度,表示這是內(nèi)存區(qū)域的大小  
  20.  
  21. //// 下面把原始的顯示大小字節(jié)數(shù)組轉換為內(nèi)存中實際存放的字節(jié)數(shù)組  
  22. int posScan = 0, posReal = 0;// 分別設置兩個位置指針,指向源數(shù)組和目標數(shù)組  
  23. byte[] pixelValues = new byte[scanBytes];  //為目標數(shù)組分配內(nèi)存  
  24.  
  25.   for (int x = 0; x < height; x++)  
  26. {  
  27.  //// 下面的循環(huán)節(jié)是模擬行掃描  
  28.  for (int y = 0; y < width; y++)  
  29.  {  
  30.  pixelValues[posScan++] = rawValues[posReal++];  
  31.  }  
  32.  posScan += offset;  //行掃描結束,要將目標位置指針移過那段“間隙”  
  33. }  
  34.    
  35. //// 用Marshal的Copy方法,將剛才得到的內(nèi)存字節(jié)數(shù)組復制到BitmapData中  
  36. System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, iptr, scanBytes);  
  37. bmp.UnlockBits(bmpData);  // 解鎖內(nèi)存區(qū)域  
  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數(shù)組轉化成圖像 

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

C#byte數(shù)組轉化成圖像 

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

【編輯推薦】

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

2009-08-28 14:25:57

C# byte數(shù)組

2009-08-13 13:03:52

C#結構體數(shù)組

2010-03-30 16:56:01

Oracle函數(shù)

2018-10-19 05:03:25

2015-06-05 11:24:17

WPS金山軟件

2011-09-07 15:38:33

Ubuntuccd2isonrg2iso

2014-03-19 10:44:51

Linuxpng圖片

2021-06-11 21:46:31

RocketMQ數(shù)據(jù)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

大數(shù)據(jù)數(shù)據(jù)科學家貨幣

2024-09-26 09:12:35

vueOCR前端

2009-08-26 13:07:07

C#交錯數(shù)組

2010-01-20 10:19:55

C++數(shù)組

2009-08-06 10:14:15

C#引用類型數(shù)組

2009-08-07 13:39:13

C#定義整型數(shù)組

2022-07-05 10:09:18

exceljson文件

2009-09-23 09:36:34

C#數(shù)組

2009-09-02 10:58:02

C#動態(tài)數(shù)組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线观看一区 | 黄色毛片在线播放 | 国产91久久精品一区二区 | 亚洲最新在线视频 | 亚洲国产二区 | 一区二区三区免费在线观看 | 欧美日韩国产精品一区二区 | 日韩精品一区二区三区中文在线 | 久久激情网 | 中文字幕在线一区 | 91爱啪啪 | 国产精品高潮呻吟久久 | 久久精彩视频 | 亚洲成人一区二区 | 国内精品视频在线 | 亚洲精品二区 | 天天拍天天操 | 日韩欧美精品 | 亚洲狠狠| 日日夜夜精品 | 亚洲看片网站 | 狠狠做深爱婷婷综合一区 | 91香蕉视频在线观看 | 日韩一区二区三区在线 | 99国产精品久久久 | 久久久久久毛片免费观看 | 国产精品美女久久久 | 国产成人精品久久久 | 91麻豆精品一区二区三区 | 人人看人人干 | 日韩一区二区在线播放 | 亚洲精品视频在线 | 久久国产高清 | 午夜精品久久久久99蜜 | 人人鲁人人莫人人爱精品 | 久久国产精品首页 | www.日本在线观看 | 国产精品久久久久久久久久久久冷 | 国产成人小视频 | a久久 | 在线一区视频 |