Перейти к содержимому
Compvision.ru
mrgloom

Рисование поверх картинки и сопутствующее.

Recommended Posts

Допустим я рисую поверх картинки с помощью PolyPolyline, нарисовал например квадрат, как сделать так чтобы этот квадрат можно было передвигать мышкой?

т.е. например перемещать то его наверно возможно отлавливая куда указывает мышка и начинать отрисовывать левый верхний угол квадрата с этой точки, но как сделать как бы драг энд дроп(хотя наверно можно проверять координату мышки и координаты квадрата и если расстояние между ними меньше какой то константы и нажата кнопка мыши, то при передвижении курсора мышки чтобы двигался квадрат)?

Как сохранить изображение с нанесенным на него квадратом аля принтскрин, только какую то область изображения.

есть идея брать координаты нарисованных линий и рисовать их в само изображение, но может можно как то средствами GDI не залезая в изображение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Допустим я рисую поверх картинки с помощью PolyPolyline, нарисовал например квадрат, как сделать так чтобы этот квадрат можно было передвигать мышкой?

т.е. например перемещать то его наверно возможно отлавливая куда указывает мышка и начинать отрисовывать левый верхний угол квадрата с этой точки, но как сделать как бы драг энд дроп(хотя наверно можно проверять координату мышки и координаты квадрата и если расстояние между ними меньше какой то константы и нажата кнопка мыши, то при передвижении курсора мышки чтобы двигался квадрат)?

Для этого надо поймать событие назажатия WM_LBUTTONDOWN левой кнопки мыши и ловить события перемещения WM_MOUSEMOVE указателя мыши (это даст координаты указателя), при перемещении производить repaint изображения.

Как сохранить изображение с нанесенным на него квадратом аля принтскрин, только какую то область изображения.

есть идея брать координаты нарисованных линий и рисовать их в само изображение, но может можно как то средствами GDI не залезая в изображение?

А зачем? Получаете изображение - выделяете нужную часть ... Ну как вариант, для особо извращенных старательных - программно снять скриншот, узнать координаты формы приложения (глобальные) GetWindowRect(), узнать координаты контрола (локальные), ну и собственно выделить необходимый участок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Для этого надо поймать событие назажатия WM_MBUTTONDOWN левой кнопки мыши и ловить события перемещения WM_MOUSEMOVE указателя мыши (это даст координаты указателя), при перемещении производить repaint изображения.

это просто сделает перемещение квадрата на то место куда указывает мышка, я же про то говорил, что его надо сначала "подхватить",а потом уже двигать.

А зачем? Получаете изображение - выделяете нужную часть ... Ну как вариант, для особо извращенных старательных - программно снять скриншот, узнать координаты формы приложения (глобальные) GetWindowRect(), узнать координаты контрола (локальные), ну и собственно выделить необходимый участок.

не очень понял, если просто выделить часть изображения и сохранить ее, то сохранится только эта часть ,а мне надо чтобы сохранилось, и то что я нарисовал поверх, т.е. изображение, а на нем нарисован квадрат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

это просто сделает перемещение квадрата на то место куда указывает мышка, я же про то говорил, что его надо сначала "подхватить",а потом уже двигать.

Нет не сделает ... у мыши есть события:

WM_LBUTTONDOWN // при ЗАжатии левой кнопки мыши

WM_MOUSEMOVE // при перемещении мыша

WM_LBUTTONUP // при отпускании левой кнопки мыши

линк: http://msdn.microsof...7(v=VS.85).aspx

Делаем репаинт при перемещении и зажатой левой кливиши мыши, при вылове события WM_LBUTTONUP фиксируем координаты квадрата по координатам указателя мыши + некоторое смещение, ведь мы можем ухватиться за любое место квадрата

не очень понял, если просто выделить часть изображения и сохранить ее, то сохранится только эта часть ,а мне надо чтобы сохранилось, и то что я нарисовал поверх, т.е. изображение, а на нем нарисован квадрат.

Почему не сохранится ? У вас ж "квадрат" тоже перемещается и находится на изображении, точнее, он часть этого изображения.

p.s. Может я не так все понимаю, будет лучше все визуализировать, как говорится: "лучше 1 раз увидеть, чем ..." :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот накидал простенький код на C#:


using System;

using System.Drawing;

using System.Windows.Forms;

using Timer = System.Windows.Forms.Timer;


namespace OLOLO

{

    public partial class Form1 : Form

    {

        private const int KvadratWh = 100; // размер стороны ■

        private int _kvadratShiftX, _kvadratShiftY; // значения смещений


        Rectangle _kvadrat; // ■

        readonly Timer _repainter = new Timer(); // таймер, делающий репаинт


        private bool _leftBtnDown; // флаг, хранящий ЗАжатие ЛКМ


        public Form1()

        {

            InitializeComponent();


            _kvadrat = new Rectangle(pb1.Width / 2 - KvadratWh / 2, pb1.Height / 2 - KvadratWh / 2, KvadratWh, KvadratWh); // центрируем ■


            _repainter.Interval = 50; // репаинт через каждые 50 мс

            _repainter.Tick += RepainterTick; 

            _repainter.Start();

        }


        void RepainterTick(object sender, EventArgs e)

        {

            var graphics = pb1.CreateGraphics();

            graphics.FillRectangle(Brushes.Tomato, 0, 0, pb1.Width, pb1.Height); // рисуем фон

            graphics.FillRectangle(Brushes.Black, _kvadrat); // рисуем ■

        }


        private void Pb1MouseMove(object sender, MouseEventArgs e)

        {

            if (_leftBtnDown)

            {

                _kvadrat.X = e.X - _kvadratShiftX;

                _kvadrat.Y = e.Y - _kvadratShiftY;

            }

        }


        private void Pb1MouseUp(object sender, MouseEventArgs e)

        {

            if (e.Button == MouseButtons.Left) _leftBtnDown = false;

        }


        private void Pb1MouseDown(object sender, MouseEventArgs e)

        {

            if ((e.Button == MouseButtons.Left) & (IsInKvadrat(e.X, e.Y)))

            {

                _kvadratShiftX = e.X - _kvadrat.X;

                _kvadratShiftY = e.Y - _kvadrat.Y;


                _leftBtnDown = true;

            }

        }


        bool IsInKvadrat(int x, int y)

        {

            if (((_kvadrat.X <= x) & (_kvadrat.X + KvadratWh >= x)) & ((_kvadrat.Y <= y) & (_kvadrat.Y + KvadratWh >= y))) return true;

            return false;

        }

     }

}

Или вот проект: OLOLO.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Делаем репаинт при перемещении и зажатой левой кливиши мыши, при вылове события WM_LBUTTONUP фиксируем координаты квадрата по координатам указателя мыши + некоторое смещение, ведь мы можем ухватиться за любое место квадрата.

я говорил про то, что его надо "захватить", т.е. если я щелкаю в какой то окрестности рамки квадрата(да на самом деле не квадрат, а рамка, или произвольная фигура состоящая из линий, которые рисуются PolyPolyline) то фигура "захватывается" и я могу ее перетаскивать.

в целом то можно смотреть расстояние от той точки где была зажата кнопка мыши до ближайшей точки фигуры, если фигура сложная я пока не понял как правильно посчитать, точнее как хранить координаты этой фигуры, чтобы легко посчитать.

Почему не сохранится ? У вас ж "квадрат" тоже перемещается и находится на изображении, точнее, он часть этого изображения.

потому что это как бы 2 разных слоя 1 само изображение, а другой линии которые выводятся PolyPolyline.

т.е. можно перерисовать линии не перерисовывая картинку, а можно наоборот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я говорил про то, что его надо "захватить", т.е. если я щелкаю в какой то окрестности рамки квадрата(да на самом деле не квадрат, а рамка, или произвольная фигура состоящая из линий, которые рисуются PolyPolyline) то фигура "захватывается" и я могу ее перетаскивать.

в целом то можно смотреть расстояние от той точки где была зажата кнопка мыши до ближайшей точки фигуры, если фигура сложная я пока не понял как правильно посчитать, точнее как хранить координаты этой фигуры, чтобы легко посчитать.

потому что это как бы 2 разных слоя 1 само изображение, а другой линии которые выводятся PolyPolyline.

т.е. можно перерисовать линии не перерисовывая картинку, а можно наоборот.

1) В примере, что я привел, тоже существует неявное разделение на пару слоев - фон и собственно сам квадрат. Насчет "захвата" - тут всё просто: гляньте функцию:

bool IsInKvadrat(int x, int y)

        {

            if (((_kvadrat.X <= x) & (_kvadrat.X + KvadratWh >= x)) & ((_kvadrat.Y <= y) & (_kvadrat.Y + KvadratWh >= y))) return true;

            return false;

        }

Она проверяет, не тыкнули ли мы в нашу фигуру: если это так - подхватываем её и таскаем сколь душе угодно.

2) Теперь насчет слоев - ведь в конце концов все выводится на конечное 2-х мерное изображение и пофигу сколько у вас слоев - изображение в итоге у вас одно. Всё, что вам нужно - в примере, что я скинул выше.

3) Так как вы рисуете вашу фигуру (какой-бы она ни была бы формы) - следовательно, вы знаете её координаты. Проблема может быть в том, что вы хотите прозрачности или что-то еще, ну тут тоже дело поправимое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я имел ввиду не закрашенную фигуру ,а контур, т.е. фигура состоит только из линий, пример на картинке, даже могут быть линии быть и не связаны, но они должны передвигаться как одно целое.

image.png

т.е. в общем случае надо цикл по всем линиям прогнать и посмотреть расстояние до точки где была нажата мышка и если хотя бы в 1 случае расстояние будет меньше заданной величины, то передвигаем фигуру.

Теперь насчет слоев - ведь в конце концов все выводится на конечное 2-х мерное изображение и пофигу сколько у вас слоев - изображение в итоге у вас одно.

еще раз посмотрю как оно рисуется и скажу поподробней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×