全面介紹C#指針操作
作者:佚名
本文介紹C#指針操作,平時我們通過GDI+操作稍大點圖片象素時,都會有一種瀕臨崩潰的感覺,我們轉下用C#指針操作。
提及.NET的指針操作,很多人并不是很了解,甚至還不知道有這么個東東,由于C#指針操作屬于unsafe操作,所以很多人對unsafe使用起來都很謹慎,其實所謂不安全代碼,其實是不受控于CLR控制下的托管執行,相當于CLR領導下的部分區域自治,當然CLR也不會去關心不安全代碼的內存分配和回收。費話少說,先體驗一下適當的C#指針操作帶來的性能提升。平時我們通過GDI+操作稍大點圖片象素時,都會有一種瀕臨崩潰的感覺,我們轉下用C#指針操作
- Bitmapmap=newBitmap(path);
- //將圖片位圖區域進行鎖定
- 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++)
- {
- //位圖結構存在一個字節對齊問題。
- 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);
- }
- }
- }
- //將位圖內存區域進行解鎖
- map.UnlockBits(mapdata);
- map.Dispose();
比較GDI+使用的GetPixel/SetPixel,讓你立馬感到這個世界多么美妙
再來一個中值濾波的操作
- ///<summary>
- ///中值濾波
- ///</summary>
- ///<paramnameparamname="dgGrayValue"></param>
- publicvoidMedianFilter(intdgGrayValue)
- {
- //100M雙線空間+50M數據庫28元/年
- //1G雙線空間+200M數據庫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;
- }
- }
- }
【編輯推薦】
責任編輯:佚名
來源:
IT168