0

画像内の特定の領域を選択するための制御を提供できる winform または wpf 用の .net フリー ライブラリはありますか?その後、その領域を別の画像として保存できます。画像上でマウスを使用してグリッドを描画し、そのグリッドを別の画像として保存できると便利です。

4

1 に答える 1

0

これはそれほど難しいことではありません。Winforms では、最小限の例を次に示します。

GraphicsPath GP = null;
List<Point> points = new List<Point>();

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    points.Clear();
    points.Add(e.Location);
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    GP = new GraphicsPath();
    GP.AddClosedCurve(points.ToArray());
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        points.Add(e.Location);
        pictureBox1.Invalidate();
    }
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (points.Count > 1)
        e.Graphics.DrawCurve(Pens.Orange, points.ToArray(), 0.5f);
}

private void cb_clearRegion_Click(object sender, EventArgs e)
{
    points.Clear();
    pictureBox1.Region = null;
}

private void cb_SaveRegion_Click(object sender, EventArgs e)
{
    Rectangle cr = pictureBox1.ClientRectangle;
    using (Bitmap bmp = new Bitmap(cr.Width, cr.Height))
    using (Graphics G = Graphics.FromImage(bmp))
    {
        G.SetClip(GP);
        G.DrawImage(pictureBox1.Image, Point.Empty);
        bmp.Save(@"D:\xyz.png", ImageFormat.Png);
    }
}

これはズームインまたはズームアウトを使用せず、すべて元のサイズと同じサイズのビットマップを作成し、領域の外側はすべて透明にすることに注意してください。

azoom の実装は簡単でScaleTransformPoint UnZoom(Point)関数を使用します。必要かどうか尋ねるだけ..

「移動」モードを追加する場合は、 を使用してMouseMoveすべての を再計算できますPoints

複数の領域が必要な場合は、それらを収集し、List<T>それらを連続して使用して出力を作成する必要があります。

画像なしでグリッドのみを保存したい場合は、G.DrawPath(..)代わりにDrawImage()!

また、線や四角形などのさまざまな描画ツールを使用して、選択範囲を絞り込むこともできます。パスに数字を段階的に追加できます。

于 2015-11-09T14:47:29.020 に答える