我正在尝试实现图像编辑器,我想在图片框上的现有图像上绘制图像。我已经使用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)
{
}
}
}
答案 0 :(得分:4)
您应该尝试将绘图代码移动到OnPaint函数,只需从MouseMove调用Invalidate。通过重新创建图形对象,在每个鼠标移动事件上绘制和处理,您将终止CPU /内存。通过将图形创建/处理留给Windows窗体,您应该获得更好的结果。 MouseMove事件每秒最多可触发125次,而OnPaint事件触发频率较低。您不希望创建三个图形上下文(每个图片框一个,一个用于表单),两个位图和一个无效调用每秒125次...
例如,一个解决方案而不是上面的解决方案是将本地预先创建的位图作为Form中的成员变量,然后在MouseDown上记录鼠标点并调用invalidate。在表单的OnPaint中,您可以根据需要使用g.DrawImage()和偏移加上reticule来绘制两个图像。
如果您能够更全面地解释您想要实现的目标,我可以给出一个代码示例 - 您可以上传一个演示项目吗?
致以最诚挚的问候,