成人免费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

2009-09-18 12:29:55

2010-05-17 15:17:06

MySQL常用操作

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 頁面

2020-01-10 16:23:44

Springboot停止服務Java

2009-09-09 11:24:46

PHP實現MVC

2011-06-16 10:48:33

session

2009-08-31 09:19:31

c#隱藏窗口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久国产 | 久久久国产精品入口麻豆 | 中文字幕精品一区二区三区精品 | 午夜影院在线视频 | 国产激情第一页 | www97影院| 在线一区视频 | 欧洲视频一区二区 | 美女人人操 | av片网| 91传媒在线观看 | 日操操夜操操 | 91精品一区二区三区久久久久久 | 久久精品国产免费 | 日韩一区二区成人 | 久草资源在线 | 亚洲高清在线 | 1级毛片 | 日韩欧美三级电影在线观看 | 91精品国模一区二区三区 | 国产成人精品一区二区三区在线 | 毛片一区| 国产999精品久久久久久 | 午夜精品久久 | 欧美一级黄色网 | 激情五月激情综合网 | 久草久 | 国产中文 | 国产一区二区三区免费观看在线 | 人人看人人射 | 九九热在线观看 | 国产一级淫片a直接免费看 免费a网站 | 日韩欧美手机在线 | 亚洲成av | 91麻豆精品国产91久久久久久久久 | 国产精品视频一区二区三区 | 日韩中文一区二区三区 | 国产黄色网址在线观看 | 人人做人人澡人人爽欧美 | 亚洲日本欧美日韩高观看 | 中文在线一区二区 |