Рисование изображения сверху на изображении в PictureBox путем захвата MouseUp и MouseMove (перетаскивание и рисование изображения) - PullRequest
2 голосов
/ 01 января 2012

Я пытаюсь реализовать редактор изображений, я хочу нарисовать изображение поверх существующего изображения в графическом окне. Я добился этого с помощью Graphics.DrawImage и с помощью пункта MouseEventArguments. Но проблема в том, что я хочу прямоугольник выделения, нарисованный поверх изображения, нарисованного при щелчке мыши над ним, и он должен быть перерисован в новой позиции, полученной щелчком мыши, и перетащить мышью (без прямоугольника выделения). Разрисовка изображения в новой позиции работает медленно и требует много памяти, поэтому я использую GC.collect. Пожалуйста, помогите мне осуществить выбор. Я публикую то, что я сделал до сих пор, ниже

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 Ответ

4 голосов
/ 01 января 2012

Вы должны попробовать переместить ваш код рисования в функцию OnPaint и просто вызвать Invalidate из MouseMove.Воссоздание графического объекта, рисование и размещение на каждом событии перемещения мыши убьют процессор / память.Оставив создание / удаление графики в Windows Forms, вы получите лучшие результаты.События MouseMove могут запускаться до 125 раз в секунду, тогда как события OnPaint запускаются реже.Вы не хотите создавать три графических контекста (по одному для каждого поля рисунка, по одному для формы), два растровых изображения и недействительный вызов 125 раз в секунду ...

Например, решение вместо вышеуказанногобыло бы просто иметь локальные предварительно созданные растровые изображения в качестве переменных-членов в форме, а затем в MouseDown записать точку мыши и вызвать invalidate.В OnPaint вашей формы вы можете рисовать оба изображения, используя g.DrawImage () и смещение и сетку, как вам нужно.

Я мог бы привести пример кода, если бы вы смогли более подробно объяснить, чего вы пытались достичь - можете ли вы загрузить демонстрационный проект?

С уважением,

...