2013-02-05 154 views
1

在过去的几个月里,我一直在研究一个应用程序,其中一个功能就是它可以裁剪图像。因此,我编写了一个绘制透明橙色矩形的函数,向用户显示裁剪区域,但它运行速度非常缓慢 - 任何人都可以帮助我/为我提供一种使其更快的方法吗?C#图像处理非常缓慢

下面是代码:

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; 
    } 
} 
+9

您在做鼠标*移动图像处理*?该事件每秒可以发射数百次。这似乎并不理想。 –

+4

步骤1)从鼠标移动事件中取出所有代码。第2步) ???步骤3)利润。 – Will

+1

这个问题会更适合[codereview.se] – hometoast

回答

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)); 
     } 
    } 
+0

非常感谢! =) 顺便说一句,所有的答案帮助我, 但其他人不是很清楚我.. –

5

的方式,使其更快是不产生对鼠标移动的位图。如果您需要绘制图形表面,请在不创建新位图的情况下进行。

3
  1. 请勿使用图片框。添加您自己的user drawn control
  2. MouseMove只是invalidate变更区域
  3. 在抽奖,直接写信给图形对象,不与内存位图不使用图片框一边玩