解析.Net中圖片的快速處理_.Net教程
推薦:關(guān)于利用C#遠(yuǎn)程存取Access數(shù)據(jù)庫(kù)目前,基于數(shù)據(jù)庫(kù)服務(wù)器的桌面管理程序和Web程序已經(jīng)有太多的應(yīng)用了,尤其是網(wǎng)絡(luò)的大量普及,孤立地?cái)?shù)據(jù)庫(kù)管理系統(tǒng)無(wú)法勝任分布式管理應(yīng)用,但是面對(duì)基于Access數(shù)據(jù)庫(kù)的現(xiàn)有的桌面應(yīng)用我們也無(wú)法完全的摒棄。我們利用.Net 遠(yuǎn)程處理功能將連接和存取Access的
在圖片處理過(guò)程中,我們經(jīng)常需要對(duì)圖片逐像素進(jìn)行處理,比如為了使圖片某一向量的顏色加深或者減淡,或者為了使圖像變化成黑白顏色,這個(gè)時(shí)候我們需要取出每個(gè)點(diǎn)上的像素進(jìn)行計(jì)算,再賦值到圖像指定的位置。在.Net中,官方提供了Image.GetPixel(int x, int y)的方法供開發(fā)人員獲取指定位置的像素,同時(shí)提供了Image.SetPixel(int x, int y, Color color)的方法來(lái)給指定位置的像素賦值。但是這個(gè)方法性能很差,假設(shè)存在一張1024*768的圖片,逐像素操作并予以緩存的話亦至少需要1027*768次GetPixel和SetPixel,處理速度將慢到無(wú)法忍受。因此本方案將使用對(duì)內(nèi)存直接讀取和賦值的方式來(lái)提高圖片處理的速度。
這里首先要介紹一個(gè)類System.Drawing.Imaging.BitmapData,直接實(shí)例化這個(gè)類沒(méi)有用處,我們需要將一個(gè)Bitmap鎖定到內(nèi)存中,來(lái)獲取一個(gè)BitmapData的實(shí)例。方法如下:
使用Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format)或者它的另一個(gè)重載Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format, BitmapData bitmapData)來(lái)將圖像數(shù)據(jù)鎖定到內(nèi)存中,以此來(lái)獲取一個(gè)與指定圖片相關(guān)聯(lián)的BitmapData實(shí)例。
在BitmapData中有一個(gè)重要的屬性Scan0,它是一個(gè)指針,指向了圖片數(shù)據(jù)所在內(nèi)存的第一個(gè)位置。使用內(nèi)存跟蹤,將Scan0的值填入地址中,可以看到內(nèi)存的分配情況(Format32bppArgb顏色深度):

這些值與圖片像素的對(duì)應(yīng)關(guān)系是這樣的:

現(xiàn)在我們可以使用System.Runtime.InteropServices.Marshal.WriteByte(IntPtr ptr, byte val)的方法來(lái)更改指定位置的像素值了,修改后只要再調(diào)用一次Bitmap.UnlockBits(BitmapData bitmapdata)來(lái)解鎖內(nèi)存就可以了,例如:
此示例將圖片上所有像素的Red向量設(shè)置為255。運(yùn)行此實(shí)例可以看到圖片變色了。
每次調(diào)用System.Runtime.InteropServices.Marshal.WriteByte(IntPtr ptr, byte val)的方法并不方便,因此我們構(gòu)造一個(gè)ColorBgra類用來(lái)儲(chǔ)存這4個(gè)顏色向量,它的主要代碼是這樣的(參考自Paint.Net提供的源碼):
使用這個(gè)類在聲明為unsafe的上下文中就可以通過(guò)計(jì)算偏移量的辦法尋址找到指定位置像素的地址(指針),例如在Format32bppArgb顏色深度的圖片中可以這樣計(jì)算:
將計(jì)算返回的指針賦給ColorBgra*。之后使用如下方法:
{
return y * 4 + x;
}
直接把值寫入內(nèi)存中,實(shí)現(xiàn)對(duì)圖片像素的快速操作。
color ->G = i;
color ->R = i;
color ->A = i;
分享:談.NET 環(huán)境下使用C# 防止SQL注入式攻擊在.NET環(huán)境下使用C#防止SQL注入式攻擊,我們的解決方式是: 1、首先在UI錄入時(shí),要控制數(shù)據(jù)的類型和長(zhǎng)度、防止SQL注入式攻擊,系統(tǒng)提供檢測(cè)注入式攻擊的函數(shù),一旦檢測(cè)出注入式攻擊,該數(shù)據(jù)即不能提交; 2、業(yè)務(wù)邏輯層控制,通過(guò)在方法內(nèi)部將SQL關(guān)鍵字用一定
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- ASP.NET實(shí)現(xiàn)頁(yè)面間值傳遞的幾種方法
- Asp.net FMS 開發(fā)視頻網(wǎng)站
- ASP.NET備份恢復(fù)SqlServer數(shù)據(jù)庫(kù)
- IsPostBack原理的介紹
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- 保護(hù)你的DLL和Code不被別人使用
- Visual Basic .NET處理Excel表格全接觸
- 解析GridView中嵌套DropDownList的實(shí)現(xiàn)
- 解讀ASP.NET如何實(shí)現(xiàn)靜態(tài)的TreeView控件導(dǎo)航
- 淺談ASP.NET 2.0服務(wù)器控件開發(fā)的基本概念
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-解析.Net中圖片的快速處理
。