.Net C# 將 BitmapData 複製到 byte[] Array 陣列 .Net C# 將 BitmapData 複製到 byte[] Array 陣列
  .NET       ez      2013-02-22

以下有兩種方法複製 BitmapData,一個是使用 unsafe 方法,一個一個 byte 複製,另外一個是複製記憶體區塊,較為快速。

目前測試為,第二種方法比第一種方法快四倍。

            using (Bitmap bmp = new Bitmap("檔案路徑"))
            {
                BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (int xx = 0; xx < 1000; xx++)
                {
                    //一個一個byte複製
                    int dataIndex = 0, height = bmpData.Height, width = bmpData.Width;
                    byte[] data = new byte[width * height * 3];
                    unsafe
                    {
                        byte* p = (byte*)bmpData.Scan0.ToPointer();
                        for (int y = 0; y < height; y++)
                        {
                            for (int x = 0; x < width; x++)
                            {
                                data[dataIndex++] = p[0];
                                data[dataIndex++] = p[1];
                                data[dataIndex++] = p[2];
                                p += 3;
                            }
                        }
                    }
                }
                sw.Stop();
                Console.WriteLine("Time1:" + sw.ElapsedMilliseconds.ToString());
                sw.Reset();
                sw.Start();
                for (int xx = 0; xx < 1000; xx++)
                {
                    byte[] data = new byte[bmpData.Width * bmpData.Height * 3];
                    Marshal.Copy(bmpData.Scan0, data, 0, data.Length); //複製記憶體區塊
                }
                sw.Stop();
                Console.WriteLine("Time2:" + sw.ElapsedMilliseconds.ToString());
                bmp.UnlockBits(bmpData);               
            }

標籤:   .NET

我要留言