2011-12-31 94 views
2

我试图实现图像编辑器,我想在图片框上的现有图像上绘制图像。我已经使用Graphics.DrawImage并使用MouseEventArguments点实现了它。但问题是我想要在绘制图像顶部绘制一个选择矩形,当鼠标点击它时,它应该重绘在新获得的位置上点击并拖动鼠标(没有选择矩形)。图像在新位置的渲染缓慢且消耗大量内存,所以我使用GC.collect.Please帮助我实现选择。我发布了我已经做到现在以下通过捕获MouseUp和MouseMove在图片框中的图像上绘制图像(拖动并绘制图像)

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing.Drawing2D; 

namespace WindowsFormsApplication32 
{ 
    public partial class Form1 : Form 
    { 
     Bitmap timg, timg2; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      timg = new Bitmap(pictureBox1.Image); 
      timg2 = new Bitmap(pictureBox1.Image); 
      pictureBox1.MouseDown+=new MouseEventHandler(pictureBox1_MouseDown); 
     pictureBox1.MouseMove+=new MouseEventHandler(pictureBox1_MouseMove); 

     } 
     private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (e.Button ==MouseButtons.Left) 
      { 
       timg = new Bitmap(timg2); 

       Graphics g = Graphics.FromImage(timg); 
       g.DrawImage(pictureBox2.Image, new Point(e.X, e.Y)); 
       pictureBox1.Image = timg; 
       g.Dispose(); 
       GC.Collect(); 
       //pictureBox1.Invalidate(); 

      } 
     } 
     private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       Graphics g = Graphics.FromImage(pictureBox1.Image); 
       g.DrawImage(pictureBox2.Image, new Point(e.X, e.Y)); 
       // pictureBox1.Invalidate(); 
        g.Dispose(); 
        GC.Collect(); 
      } 
     } 

     private void pictureBox1_Click(object sender, EventArgs e) 
     { 

     } 

    } 
} 
+0

设置公共属性,并在窗体加载图形g = Graphics.FromImage(timg); – 2011-12-31 20:35:37

回答

4

您应该尝试将您的绘图代码移到OnPaint函数,并从MouseMove调用Invalidate。通过重新创建一个图形对象,在每个鼠标移动事件上进行绘画和处理,你将杀死CPU /内存。通过将图形创建/处置留给Windows窗体,您应该可以获得更好的结果。 MouseMove事件每秒最多可触发125次,而OnPaint事件触发频率较低。您不希望创建三个图形上下文(每个图片框一个,一个用于表单),两个位图和一个无效呼叫每秒125次...

例如,解决方案而不是上述只需将本地预先创建的位图作为表单中的成员变量,然后在MouseDown上记录鼠标点并调用invalidate。在窗体的OnPaint中,您可以根据需要使用g.DrawImage()和偏移加上reticule来绘制两幅图像。

如果你能够更彻底地解释你试图达到的目标,我可以给出一个代码示例 - 你能上传一个演示项目吗?

最好的问候,

+0

伯内特感谢您的答案。我试图实现一个应用程序,允许用户在点击和拖动时移动图像。当用户点击图像时,我想要在图像周围绘制一个选择功能区/矩形框。可以为我提供一个代码请抽样。 – techno 2012-01-01 05:01:23