Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.04.2010, 14:06
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
Восклицание Выделение области ХЕЛП!!

Помогите, пожалуйста!!
Как сделать выделение произвольной области на изображении (Bitmap) ??
Потом эту выделенную область нужно в файл сохранять.
Ответить с цитированием
  #2  
Старый 14.04.2010, 17:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Отлавливаете пермещение мыши по битмапу, при нажатии кнопки начинаете рисовать прямоугольник. Когда отпускаете кнопку рисовать прямоугольник перестаете и копируете в новый битмап регион попавший в выделенную область.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 14.04.2010, 18:17
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
По умолчанию

В этом и загвоздка, что выделить нужно не прямоугольную область, а типа какую мышкой обведешь.
Если можно, выложите код, пожалуйста, как реализовать.
Ответить с цитированием
  #4  
Старый 14.04.2010, 18:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код писать лень. Идея такова: тебе надо следить за мышкой и запоминать кк координаты. Потом, по этим координатам строится регион, по которому и производится вырезание. Фактически, с момента нажатия кнопки мыши ты начинаешь запоминать ее координаты (в OnMouseMove). Когда кнопку отпускают, то перестаешь запоминать. В результате у тебя есть некоторый список координат, отражающих путь мыши. По этим координатам можно построить некоторый полигон (регион), по которому и делать обрезку. Да, не забудь замкнуть контур принудительно, т.е. в списке повторить в конце первые координаты.
Ответить с цитированием
  #5  
Старый 14.04.2010, 18:28
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
По умолчанию

Я понимаю словами как оно должно быть, но программно, боюсь, не смогу это написать... Мне сказали, что самой это сложно сделать(((((((
Ответить с цитированием
  #6  
Старый 14.04.2010, 19:00
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Тебя обманули, не сложно. Есть только одно уточнение к вышепредложенному варианту. После того как мышь отпустили желательно пройтись по списку и исключить лишние координаты.
Вот примерно так будет:
Код:
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  
Старый 14.04.2010, 20:34
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
По умолчанию

Это получается, что мы изначальное изображение в PaintBox1 загружаем, а потом то, что выделили уже хранится в Image2.Canvas.Polygon , так?
Сейчас попробую сделать, что тут написано =)
Ответить с цитированием
  #8  
Старый 14.04.2010, 21:04
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Не совсем так, там где выделяем область TImage1, а там где рисуем выделенный полигон TImage2. Это просто я поленился переименовывать имена процедур.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 14.04.2010, 22:26
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
По умолчанию

а в использовании этих компонентов есть какая-то существенная разница?? можно ли оставить PaintBox?
Ответить с цитированием
  #10  
Старый 14.04.2010, 22:52
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
По умолчанию

SelectArea какой тип имеет? у меня что-то ошибка вылазит((
Ответить с цитированием
  #11  
Старый 14.04.2010, 23:01
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Код:
SelectArea: Array of TPoint;
Можно и PaintBox, просто в TImage удобнее картинку загружать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 14.04.2010 в 23:04.
Ответить с цитированием
  #12  
Старый 15.04.2010, 00:53
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
Хорошо

Ой что-то работает))) выделяет))))
Осталось в нормальный вид все привести и обработать.
Спасибо большое, очень помогли мне!!!!
Ответить с цитированием
  #13  
Старый 15.04.2010, 13:02
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
По умолчанию

А как сделать, чтобы выделенная область была не в виде массива SelectArea, а в виде региона? (Rgn: HRGN)
Ответить с цитированием
  #14  
Старый 15.04.2010, 13:06
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от Mystery
А как сделать, чтобы выделенная область была не в виде массива SelectArea, а в виде региона? (Rgn: HRGN)
В на кой вам это потребовалось?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #15  
Старый 16.04.2010, 09:33
Аватар для Mystery
Mystery Mystery вне форума
Прохожий
 
Регистрация: 14.04.2010
Адрес: Рязань
Сообщения: 15
Репутация: 10
По умолчанию

У меня часть программы написана с использованием региона )
Там суть в том, что нужно выделить область, для этого применяем выделение по цвету сначала (волшебная палочка), а если результат не устраивает, то тогда уже вручную. Так вот волшебная палочка выделяет область в регион, и рисуется рамка для него, т.е. просто тобводится выделенная область ) а вот при выделении вручную, если делать, как описано тут, выделенная часть как бы вырезается из рисунка, и получается не очень удобно(
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter