1

ここ数か月、私はあるアプリケーションに取り組んできました。その機能の 1 つは、画像をトリミングできることです。それで、透明なオレンジ色の長方形を描画してユーザーにトリミング領域を表示する関数をコーディングしましたが、動作が非常に遅くなります.

コードは次のとおりです。

Image source;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
    mousePos = e.Location;
}

Point mousePos;

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        Image editSource = new Bitmap(source);
        Graphics g = Graphics.FromImage(editSource);
        SolidBrush brush = new SolidBrush(
            Color.FromArgb(128, Color.Orange.R, Color.Orange.G, Color.Orange.B));

        int width = e.X - mousePos.X;
        if (width < 0) {
            width *= -1;
        }

        int height = e.Y - mousePos.Y;
        if (height < 0) {
            height *= -1;
        }

        Size cropRectSize = new Size(width, height);
        Rectangle cropRect = new Rectangle(mousePos, cropRectSize);
        g.FillRectangle(brush, cropRect);
        pictureBox1.Image = editSource;
    }
}
4

3 に答える 3

5

高速化する方法は、マウスの移動時にビットマップを作成しないことです。グラフィックス サーフェスに描画する必要がある場合は、新しいビットマップを作成せずに描画してください。

于 2013-02-05T18:29:54.597 に答える
3
  1. ピクチャーボックスは使用しないでください。独自のユーザー描画コントロールを追加します。
  2. 変更されたリージョンを無効MouseMoveにするだけで
  3. Draw では、グラフィックス オブジェクトに直接書き込みます。メモリ内のビットマップを操作しないでください。
于 2013-02-05T18:33:58.707 に答える
2

ですから、ピクチャーボックスを使用しないためのすべての推奨事項は脇に置いておいてください...それを行う方法を紹介します;)

この背後にある考え方は、マウスの移動、マウスダウンなどを使用して、描画するものを保存することです。それを描画するときは、保存された状態を使用します。これにより、ピクチャ ボックス上でマウスを押すと常にオレンジ色の長方形が描画されます (ピクチャ ボックスを使用しないことをお勧めしますが、この同じアプローチを他のサーフェスにも使用できます)。

    Point startPoint;
    Point currentPoint;
    bool draw = false;
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        startPoint = e.Location;
        draw = true;
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        draw = false;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        currentPoint = e.Location;
        pictureBox1.Invalidate();
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        if (draw)
        {
            int startX = Math.Min(startPoint.X, currentPoint.X);
            int startY = Math.Min(startPoint.Y, currentPoint.Y);
            int endX = Math.Max(startPoint.X, currentPoint.X);
            int endY = Math.Max(startPoint.Y, currentPoint.Y);
            e.Graphics.DrawRectangle(Pens.Orange, new Rectangle(startX, startY, endX-startX, endY-startY));
        }
    }
于 2013-02-05T19:19:11.963 に答える