.netピクチャトリミングのパフォーマンス最適化

1842 ワード

//.Net画像の切り取り:1.非座標点をGraphicsPathに格納します.GraphicsPath gPath = new GraphicsPath();2.通常、我々は一つの座標点が閉鎖区間内でGraphicsPathを採用するかどうかを判断する.IsVisible()ですが、この方法は判断効率が低いことが証明されています.ここではRegionを採用します.IsVisible()テスト済みGraphicsPath.IsVisible()800*800の画像を処理するには14 s以上の時間がかかります.Region.IsVisible()は1 sだけ必要です.
  //

        /// <summary>

        ///  

        /// </summary>

        /// <param name="bitmap"> </param>

        /// <param name="path"> </param>

        /// <returns></returns>

        public static Bitmap BitmapCropGzf(Bitmap bitmap, GraphicsPath path)

        {

            RectangleF rect = path.GetBounds();

            int left = (int)rect.Left;

            int top = (int)rect.Top;

            int width = (int)rect.Width;

            int height = (int)rect.Height;

            // :

            Bitmap imgCropped = new Bitmap(width, height);

            Graphics objGraphics = Graphics.FromImage(imgCropped);

            objGraphics.Clear(System.Drawing.Color.White);

            int intStartTop = -top;

            int intStartLeft = -left;

            Bitmap b = new Bitmap(bitmap);

            objGraphics.DrawImage(b, intStartLeft, intStartTop);

            b.Dispose();

            objGraphics.Dispose();

            Region r = new Region(path);

            GC.Collect(0);

            for (int i = left; i < left + width; i++)

            {

                for (int j = top; j < top + height; j++)

                {

                    //    

                    if (!r.IsVisible(i, j))

                    {

                        imgCropped.SetPixel(i - left, j - top, System.Drawing.Color.Transparent);

                    }

                }

            }

            return imgCropped;

        }