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. OnMouseMove只是使更改的区域无效
  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 回答