全面介紹C#指針操作
提及.NET的指針操作,很多人并不是很了解,甚至還不知道有這么個(gè)東東,由于C#指針操作屬于unsafe操作,所以很多人對(duì)unsafe使用起來(lái)都很謹(jǐn)慎,其實(shí)所謂不安全代碼,其實(shí)是不受控于CLR控制下的托管執(zhí)行,相當(dāng)于CLR領(lǐng)導(dǎo)下的部分區(qū)域自治,當(dāng)然CLR也不會(huì)去關(guān)心不安全代碼的內(nèi)存分配和回收。費(fèi)話少說(shuō),先體驗(yàn)一下適當(dāng)?shù)腃#指針操作帶來(lái)的性能提升。平時(shí)我們通過(guò)GDI+操作稍大點(diǎn)圖片象素時(shí),都會(huì)有一種瀕臨崩潰的感覺(jué),我們轉(zhuǎn)下用C#指針操作
- Bitmapmap=newBitmap(path);
 - //將圖片位圖區(qū)域進(jìn)行鎖定
 - BitmapDatamapdata=map.LockBits(newRectangle(0,0,map.Width,map.Height),
 
ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);- unsafe
 - {
 - byte*pixpoint;
 - intnewpoint;
 - for(inti=0;i<map.Width;i++)
 - {
 - for(intj=0;j<map.Height;j++)
 - {
 - //位圖結(jié)構(gòu)存在一個(gè)字節(jié)對(duì)齊問(wèn)題。
 - pixpoint=(byte*)mapdata.Scan0;+i*3+j*mapdata.Stride;
 - newpoint=(*pixpoint*11+*(pixpoint+1)*59+*(pixpoint+2)*30)/100;
 - *(pixpoint++)=(byte)newpoint;
 - *(pixpoint++)=(byte)newpoint;
 - *(pixpoint++)=(byte)newpoint;
 - //非指針操作
 - //Colorpxcl=map.GetPixel(i,j);
 - //map.SetPixel(i,j,(pxcl.R*11+pxcl.G*59+pxcl*30)/100);
 - }
 - }
 - }
 - //將位圖內(nèi)存區(qū)域進(jìn)行解鎖
 - map.UnlockBits(mapdata);
 - map.Dispose();
 
比較GDI+使用的GetPixel/SetPixel,讓你立馬感到這個(gè)世界多么美妙
再來(lái)一個(gè)中值濾波的操作
- ///<summary>
 - ///中值濾波
 - ///</summary>
 - ///<paramnameparamname="dgGrayValue"></param>
 - publicvoidMedianFilter(intdgGrayValue)
 - {
 - //100M雙線空間+50M數(shù)據(jù)庫(kù)28元/年
 - //1G雙線空間+200M數(shù)據(jù)庫(kù)100元/年
 - //QQ:70975363
 - bytes;
 - byte[]p=newbyte[9];
 - inti,j;
 - intx,y;
 - intStride;
 - unsafe
 - {
 - byte*point=(byte*)this.ImageData.Scan0;
 - Stride=this.ImageData.Stride;
 - pointpoint=point+3+this.ImageData.Stride;
 - for(i=0;i<this.ImageData.Height-1;i++)
 - {
 - for(j=0;j<this.ImageData.Width-1;j++)
 - {
 - p[0]=*(point-Stride-1);
 - p[1]=*(point-Stride+2);
 - p[2]=*(point-Stride+5);
 - p[3]=*(point-1);
 - p[4]=*(point+2);
 - p[5]=*(point+5);
 - p[6]=*(point+Stride-1);
 - p[7]=*(point+Stride+2);
 - p[8]=*(point+Stride+5);
 - for(x=0;x<5;x++)
 - {
 - for(y=x+1;y<9;y++)
 - {
 - if(p[x]>p[y])
 - {
 - s=p[x];
 - p[x]=p[y];
 - p[y]=s;
 - }
 - }
 - }
 - *ppoint=p[4];
 - *(point-1)=p[4];
 - *(point-2)=p[4];
 - point+=3;
 - }
 - point+=Stride-this.ImageData.Width*3;
 - }
 - }
 - }
 
【編輯推薦】















 
 
 
 
 
 
 