Sunday, November 2, 2014

C# Bitmap 픽셀 처리(읽기/쓰기)

C# Bitmap에서 SetPixel, GetPixel을 사용하게 되면 매우 느리게 된다.(전체 픽셀을 다룰 경우) 그럴경우 다음과 같이 픽셀 포인터를 얻어서 사용하면 매우 빠르기 픽셀 처리를 할수 있다. 이를 위해서는 unsafe옵션을 켜주어야 한다.

private Image _image = null;

// 비트맵 픽셀 처리
        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap bitmap = new Bitmap(100, 100);
            BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, 100, 100), ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            unsafe
            {
                byte* ptr = (byte* )bmpData.Scan0.ToPointer();
                for (int i = 0; i < bmpData.Height; i++)
                {
                    for (int j = 0; j < bmpData.Width; j++)
                    {
                        ptr[bmpData.Stride * i + 3 * j + 0] = 0;// B
                        ptr[bmpData.Stride * i + 3 * j + 1] = 0;// G
                        ptr[bmpData.Stride * i + 3 * j + 2] = 255;// R
                    }
                }
                bitmap.UnlockBits(bmpData);
            }
            _image = bitmap;
        }

// 비트맵 그리기
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (_image != null)
            {
                g.DrawImage(_image, 0, 0, _image.Width * _imageScale, _image.Height * _imageScale);
            }
        }

No comments:

Post a Comment