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

淺談.NET圖片快速處理的幾種方法

開發 后端
在.NET圖片快速處理過程中,我們經常需要對圖片逐像素進行處理,比如為了使圖片某一向量的顏色加深或者減淡,或者為了使圖像變化成黑白顏色,這個時候我們需要取出每個點上的像素進行計算,再賦值到圖像指定的位置。

這里首先要介紹一個類System.Drawing.Imaging.BitmapData,直接實例化這個類沒有用處,我們需要將一個Bitmap鎖定到內存中,來獲取一個BitmapData的實例。.NET圖片快速處理方法如下:

使用Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format)或者它的另一個重載Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format, BitmapData bitmapData)來將圖像數據鎖定到內存中,以此來獲取一個與指定圖片相關聯的BitmapData實例。

在BitmapData中有一個重要的屬性Scan0,它是一個指針,指向了圖片數據所在內存的***個位置。使用內存跟蹤,將Scan0的值填入地址中,可以看到內存的分配情況(Format32bppArgb顏色深度):

內存的分配情況

這些值與圖片像素的對應關系是這樣的:

值與圖片像素的對應關系


現在我們可以使用System.Runtime.InteropServices.Marshal.WriteByte(IntPtr ptr, byte val)的方法來更改指定位置的像素值了,修改后只要再調用一次Bitmap.UnlockBits(BitmapData bitmapdata)來解鎖內存就可以了,例如:

  1. private void LockUnlockBitsExample(PaintEventArgs e)  
  2. {  
  3. Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg");  
  4. Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);  
  5. System.Drawing.Imaging.BitmapData bmpbmpData =  
  6. bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,  
  7. bmp.PixelFormat);  
  8. IntPtr ptr = bmpData.Scan0;  
  9. int bytes = bmp.Width * bmp.Height * 3;  
  10. byte[] rgbValues = new byte[bytes];  
  11. for (int counter = 0; counter < rgbValues.Length; counter += 3)  
  12. {  
  13. Marshal.WriteByte(ptr, counter, 255);  
  14. }  
  15. bmp.UnlockBits(bmpData);  
  16. e.Graphics.DrawImage(bmp, 0, 0);  

此.NET圖片快速處理示例將圖片上所有像素的Red向量設置為255。運行此實例可以看到圖片變色了。

每次調用System.Runtime.InteropServices.Marshal.WriteByte(IntPtr ptr, byte val)的方法并不方便,因此我們構造一個ColorBgra類用來儲存這4個顏色向量,它的主要代碼是這樣的(參考自Paint.Net提供的源碼):

  1. [StructLayout(LayoutKind.Explicit)]  
  2. public struct ColorBgra  
  3. {  
  4. [FieldOffset(0)]  
  5. public byte B;  
  6.    
  7. [FieldOffset(1)]  
  8. public byte G;  
  9.    
  10. [FieldOffset(2)]  
  11. public byte R;  
  12.    
  13. [FieldOffset(3)]  
  14. public byte A;  
  15.  
  16. /// <summary> 
  17. /// Lets you change B, G, R, and A at the same time.  
  18. /// </summary> 
  19. [FieldOffset(0)]  
  20. public uint Bgra;  
  21. public override string ToString()  
  22. {  
  23. return "B: " + B + ", G: " + G + ", R: " + R + ", A: " + A;  
  24. }  

使用這個類在聲明為unsafe的上下文中就可以通過計算偏移量的辦法尋址找到指定位置像素的地址(指針),例如在Format32bppArgb顏色深度的圖片中可以這樣計算:

  1. public unsafe ColorBgra* GetPointAddress(int x, int y)  
  2. {  
  3. return y * 4 + x;  

將計算返回的指針賦給ColorBgra*。之后使用如下方法:

  1. color->B = i;  color ->G = i;  color ->R = i;  color ->A = i;  

直接把值寫入內存中,實現.NET圖片快速處理操作。

【編輯推薦】

  1. .NET 4.0內存映射文件詳解
  2. .NET真的不用管內存嗎?從List< T>列表聊起
  3. 淺析C#編程中的內存管理
  4. .NET內存中敏感數據的保護方案
  5. 淺析.NET框架下的自動內存管理
責任編輯:彭凡 來源: cnblogs
相關推薦

2013-08-21 11:31:21

iPhone圖片方法

2009-07-20 17:07:30

提高ASP.NET性能

2010-09-08 13:53:10

.NET連接Sybas

2009-09-18 09:16:06

.NET垃圾回收

2009-09-04 11:20:47

ASP.NET頁面間值

2011-09-06 16:56:43

2010-05-17 15:17:06

MySQL常用操作

2009-09-18 12:29:55

2010-06-03 08:55:43

LINQ

2024-11-07 12:33:47

2009-12-16 09:16:53

ASP.NET頁面間數

2010-01-22 14:46:25

C++語言

2010-04-30 16:22:07

Unix終端

2010-10-26 09:23:03

Web Service

2021-03-08 09:32:04

Python文件命令

2020-08-24 08:05:47

JavaScriptJavaScript 頁面

2009-09-09 11:24:46

PHP實現MVC

2011-06-16 10:48:33

session

2009-08-31 09:19:31

c#隱藏窗口

2020-01-10 16:23:44

Springboot停止服務Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩精品在线一区 | 中文字幕第三页 | 羞羞视频在线网站观看 | 一级欧美日韩 | www.4虎影院 国产999精品久久久影片官网 | 中文字幕一区二区三区在线视频 | 日韩一| 日本在线观看视频 | 欧美片网站免费 | 国产在线中文字幕 | 精品国产一区二区国模嫣然 | 免费久久网站 | 99视频在线免费观看 | 久久免费视频观看 | 一级毛片视频 | 盗摄精品av一区二区三区 | 国产美女精品视频 | 懂色中文一区二区三区在线视频 | 97色在线视频 | 日本网站免费在线观看 | 99精品网站 | japan21xxxxhd美女| 日本天天色| 久久夜色精品国产 | 亚洲视频在线观看免费 | 久久91精品久久久久久9鸭 | 三级黄视频在线观看 | 久久久精品天堂 | 亚av在线| 牛牛热在线视频 | 中文字幕福利视频 | 91久久国产综合久久91精品网站 | 国产精品成人一区二区 | 久久欧美精品 | 一级毛片成人免费看a | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 欧美aaaaaaaaaa| 日日噜噜噜夜夜爽爽狠狠视频97 | 久久精品亚洲精品国产欧美 | www.一区二区三区.com | 婷婷久久久久 |