Jump to content
Compvision.ru
Sign in to follow this  
mrgloom

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

Recommended Posts

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Для этого надо поймать событие назажатия WM_MBUTTONDOWN левой кнопки мыши и ловить события перемещения WM_MOUSEMOVE указателя мыши (это даст координаты указателя), при перемещении производить repaint изображения.

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Вот накидал простенький код на 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

Share this post


Link to post
Share on other sites
Делаем репаинт при перемещении и зажатой левой кливиши мыши, при вылове события WM_LBUTTONUP фиксируем координаты квадрата по координатам указателя мыши + некоторое смещение, ведь мы можем ухватиться за любое место квадрата.

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

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

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

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

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

Share this post


Link to post
Share on other sites

я говорил про то, что его надо "захватить", т.е. если я щелкаю в какой то окрестности рамки квадрата(да на самом деле не квадрат, а рамка, или произвольная фигура состоящая из линий, которые рисуются 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) Так как вы рисуете вашу фигуру (какой-бы она ни была бы формы) - следовательно, вы знаете её координаты. Проблема может быть в том, что вы хотите прозрачности или что-то еще, ну тут тоже дело поправимое.

Share this post


Link to post
Share on other sites

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

image.png

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×