|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Выделение области ХЕЛП!!
Помогите, пожалуйста!!
Как сделать выделение произвольной области на изображении (Bitmap) ?? Потом эту выделенную область нужно в файл сохранять. |
#2
|
||||
|
||||
Отлавливаете пермещение мыши по битмапу, при нажатии кнопки начинаете рисовать прямоугольник. Когда отпускаете кнопку рисовать прямоугольник перестаете и копируете в новый битмап регион попавший в выделенную область.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
||||
|
||||
В этом и загвоздка, что выделить нужно не прямоугольную область, а типа какую мышкой обведешь.
Если можно, выложите код, пожалуйста, как реализовать. |
#4
|
|||
|
|||
Код писать лень. Идея такова: тебе надо следить за мышкой и запоминать кк координаты. Потом, по этим координатам строится регион, по которому и производится вырезание. Фактически, с момента нажатия кнопки мыши ты начинаешь запоминать ее координаты (в OnMouseMove). Когда кнопку отпускают, то перестаешь запоминать. В результате у тебя есть некоторый список координат, отражающих путь мыши. По этим координатам можно построить некоторый полигон (регион), по которому и делать обрезку. Да, не забудь замкнуть контур принудительно, т.е. в списке повторить в конце первые координаты.
|
#5
|
||||
|
||||
Я понимаю словами как оно должно быть, но программно, боюсь, не смогу это написать... Мне сказали, что самой это сложно сделать(((((((
|
#6
|
||||
|
||||
Тебя обманули, не сложно. Есть только одно уточнение к вышепредложенному варианту. После того как мышь отпустили желательно пройтись по списку и исключить лишние координаты.
Вот примерно так будет: Код:
procedure TForm1.FormCreate(Sender: TObject); begin StartSelectArea := False; end; procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin StartSelectArea := True; SetLength(SelectArea, 1); SelectArea[0] := Point(X,Y); end; procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if StartSelectArea then if (SelectArea[High(SelectArea)].X <> X) or (SelectArea[High(SelectArea)].Y <> Y) then begin SetLength(SelectArea, Length(SelectArea)+1); SelectArea[High(SelectArea)] := Point(X,Y); end; end; procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin StartSelectArea := False; Image2.Canvas.Pen.Color := clRed; Image2.Canvas.Polygon(SelectArea); end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 14.04.2010 в 19:18. |
#7
|
||||
|
||||
Это получается, что мы изначальное изображение в PaintBox1 загружаем, а потом то, что выделили уже хранится в Image2.Canvas.Polygon , так?
Сейчас попробую сделать, что тут написано =) |
#8
|
||||
|
||||
Не совсем так, там где выделяем область TImage1, а там где рисуем выделенный полигон TImage2. Это просто я поленился переименовывать имена процедур.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
||||
|
||||
а в использовании этих компонентов есть какая-то существенная разница?? можно ли оставить PaintBox?
|
#10
|
||||
|
||||
SelectArea какой тип имеет? у меня что-то ошибка вылазит((
|
#11
|
||||
|
||||
Код:
SelectArea: Array of TPoint; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 14.04.2010 в 23:04. |
#12
|
||||
|
||||
Ой что-то работает))) выделяет))))
Осталось в нормальный вид все привести и обработать. Спасибо большое, очень помогли мне!!!! |
#13
|
||||
|
||||
А как сделать, чтобы выделенная область была не в виде массива SelectArea, а в виде региона? (Rgn: HRGN)
|
#14
|
||||
|
||||
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#15
|
||||
|
||||
У меня часть программы написана с использованием региона )
Там суть в том, что нужно выделить область, для этого применяем выделение по цвету сначала (волшебная палочка), а если результат не устраивает, то тогда уже вручную. Так вот волшебная палочка выделяет область в регион, и рисуется рамка для него, т.е. просто тобводится выделенная область ) а вот при выделении вручную, если делать, как описано тут, выделенная часть как бы вырезается из рисунка, и получается не очень удобно( |