通过捕获MouseUp和MouseMove在PictureBox中的图像上绘制图像(拖放图像)

时间:2011-12-31 20:21:41

标签: c# .net image drawing gdi+

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

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)
        {

        }

    }
}

1 个答案:

答案 0 :(得分:4)

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

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

如果您能够更全面地解释您想要实现的目标,我可以给出一个代码示例 - 您可以上传一个演示项目吗?

致以最诚挚的问候,