如標題,因為SetPixel太慢,因此我在論壇上找到了利用LockBit的方法想要增加速度他是讀出來直接輸出圖片但是我希望他能夠儲存再一個事先宣告好的二維陣列以便將來做處理,最後再經由這個二維陣列用同樣的LockBit方法輸出我將論壇找到的程式碼改了一下但是卻發現,我輸入到二維陣列,出了那個副程式 值就不見了,想請各位大大幫我看看問題出在哪裡,謝謝!
下面看到,我先把data這個二維陣列宣告為全域變數,所以我不懂後面為什麼會不見變成nullpublic partial class Form1 : Form
    {
        String filename;
        public int height, width;
        public int[,] data;
        Bitmap input;        private void 開啟ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                filename = openFileDialog1.FileName;
                pictureBox1.Image = Image.FromFile(filename);                input = new Bitmap(filename);
                height = input.Height;
                width = input.Width;                int[,] data = new int[height,width];                /*利用記憶體Lock方式讀取圖片(比 GetPixel 快許多)*/
                Bitmap bmpOut = new Bitmap(width, height, PixelFormat.Format24bppRgb);                BitmapData dataIn = input.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);                
                //在C#下,用指摽必須先宣告一段unsafe,在此範圍內才可用指標。
                unsafe    
                {
                    byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
                    byte* pOut = (byte*)(dataOut.Scan0.ToPointer());                    for (int y = 0; y < dataIn.Height; y++)
                    {
                        for (int x = 0; x < dataIn.Width; x++)
                        {
                            data[x, y] = pIn[0];
                            data[x, y] = pIn[0];
                            data[x, y] = pIn[0];                            pOut[0] = (byte)data[x, y];
                            pOut[1] = (byte)data[x, y];
                            pOut[2] = (byte)data[x, y];                            pIn += 3;
                            pOut += 3; 
                        }                        pIn += dataIn.Stride - dataIn.Width * 3;
                        pOut += dataOut.Stride - dataOut.Width * 3;
                    }
                }                bmpOut.UnlockBits(dataOut);
                input.UnlockBits(dataIn);
                pictureBox1.Image = bmpOut;
               
            }
           
        }

解决方案 »

  1.   

    这个循环改成就可以了                    for (int y = 0; y < dataIn.Width; y++)
                        {
                            for (int x = 0; x < dataIn.Height; x++)
                            {
      

  2.   

    int[,] data = new int[height,width];
    这里你用得是局部变量,和全局变量的名字一样是不行的.这像全局变量就不会起作用的
    改成
    data = new int[width,height];
      

  3.   

    int[,] data = new int[height,width];
    這裡你用得是局部變量,和全局變量的名字一樣是不行的.這像全局變量就不會起作用的
    改成
    data = new int[width,height];//--------------------------感謝xingyuebuyu的回答原來我連最基本的都疏忽了!感嗯!