在c#中用指針操作圖片像素點


在Bitmap類中有兩個函數SetPixel,GetPixel,分別用來設置或讀取圖片中指定點的顏色(這里發現了VS的一個錯誤,SetPixel的文檔說明寫的是“獲取顏色”??)。

      當要對一幅圖進行相當操作時,用這兩個函數,性能上就不盡人意了……這時就可以考慮用指針來對性能進行提升。

      這里介紹兩種方法:

      一、

1public struct Pixel
 2{
   public byte B;         //
   public byte G;        //
   public byte R;        //
 6}
 8public void ReadColor()
 9{
   Bitmap b=new Bitmap("d:\\a.bmp");
   BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb);
   unsafe 
   {
           Pixel* p = null;
           for (int x = 0; x < b.Width; x++) 
           {
               p = (Pixel*)bData.Scan0 + x * b.Height;
               for (int y = 0; y < b.Height; y++) 
               {
                       int R = p->R;
                       int G = p->G;
                       int B = p->B;
                       //這里獲取顏色分量的各個值,同樣在這里還可以對其進行賦值
               }
           }
   }
   b.UnlockBits(bData);
28}

  二:

//這里的x,y參數,指的是圖像中像素點的x,y坐標
 pubic void ReadColor(int x,int y)
 {     
    Bitmap b = new Bitmap("d:\\a.bmp");
   BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, 
PixelFormat.Format24bppRgb);
            unsafe {
            byte* color = (byte*)bData.Scan0 + x * 3 + y *       Data.Stride;
                int R = *(color + 2);
                int G = *(color + 1);
                int B = *color;
                //同樣在這里也可以對其行進修改
           }   
            b.UnlockBits(bData);
}

  

通過以上的代碼可以很容易的知道怎么指針來操作像素點。

這里要說明的是,第一種方法中的x,y不能和圖像中坐標進行對應(特別要注意),如果對一幅圖的每個點都進行同樣的操作可以考慮第一種方法。但要對某些特定坐標上的點進行操作那就只能用第二種方法了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM