自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

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

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

3、Bitmap類雖然提供了GetPixel()、SetPixel()這樣的方法,但我們絕對(duì)不能用這兩個(gè)方法來(lái)進(jìn)行大規(guī)模的像素讀寫(xiě),因?yàn)樗鼈兊男阅軐?shí)在很囧;

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

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

代碼如下,解說(shuō)寫(xiě)在注釋里了:

  1. /// <summary>  
  2. /// 將一個(gè)字節(jié)數(shù)組轉(zhuǎn)換為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. //// 申請(qǐng)目標(biāo)位圖的變量,并將其內(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ù)組轉(zhuǎn)換為內(nèi)存中實(shí)際存放的字節(jié)數(shù)組  
  22. int posScan = 0, posReal = 0;// 分別設(shè)置兩個(gè)位置指針,指向源數(shù)組和目標(biāo)數(shù)組  
  23. byte[] pixelValues = new byte[scanBytes];  //為目標(biāo)數(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;  //行掃描結(jié)束,要將目標(biāo)位置指針移過(guò)那段“間隙”  
  33. }  
  34.    
  35. //// 用Marshal的Copy方法,將剛才得到的內(nèi)存字節(jié)數(shù)組復(fù)制到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. //// 算法到此結(jié)束,返回結(jié)果  
  53. return bmp;  
  54. }  

下面是我用來(lái)測(cè)試的代碼片段:

  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.   }  

結(jié)果應(yīng)該顯示成下面的樣子:

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

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

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

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

【編輯推薦】

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

2009-08-28 14:25:57

C# byte數(shù)組

2009-08-13 13:03:52

C#結(jié)構(gòu)體數(shù)組

2018-10-19 05:03:25

2010-03-30 16:56:01

Oracle函數(shù)

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

2010-08-02 10:35:19

Flex3教程

2010-07-01 12:09:46

UML類圖

2017-07-25 15:09:48

Linux地址轉(zhuǎn)化

2021-10-08 13:45:23

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

2024-09-26 09:12:35

vueOCR前端

2009-08-26 13:07:07

C#交錯(cuò)數(shù)組

2022-07-05 10:09:18

exceljson文件

2010-01-20 10:19:55

C++數(shù)組

2009-08-31 14:46:15

C# string b

2009-08-31 14:56:32

C# Byte數(shù)組轉(zhuǎn)換

2009-08-06 10:14:15

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

2009-08-07 13:39:13

C#定義整型數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)