.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;
}