Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2010, 20:22   #1
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию Выделение области на изображении непрерывными отрезками

Всем доброго времени суток. Я хочу выделить на изображении определенный участок, при помощи непрерывных отрезков, т.е. сначал я ставлю первую начальную точку, когда ставлю вторую она соединяется отрезком с первой, ставлю третью - она соединяется со второй и т.д., пока не приду обратно в первую точку.
Не знаю как можно реализовать, есть пример работы с графикой, но там такого нету, сам не додумался как сделать, поэтому спрашиваю здесь. Посоветуйте как можно реализовать
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 21.04.2010, 20:26   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

MoveTo, LineTo
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.04.2010, 20:35   #3
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

mutabor, а дальше? Я как рисовать примерно знаю, но мне нужно не просто один отрезок нарисовать

UPD:

Сделал так:

Код:
  Canvas.Pen.Color := clRed;
  if intCurPosX <> 0 then
  begin
    Canvas.MoveTo(intCurPosX, intCurPosY);
    Canvas.LineTo(Mouse.CursorPos.X - frmMain.Left, Mouse.CursorPos.Y - frmMain.Top);
  end;
  intCurPosX := Mouse.CursorPos.X - frmMain.Left;
  intCurPosY := Mouse.CursorPos.Y - frmMain.Top;
Но есть проблема точка ставится не прямо под курсором, а смещенно вниз и вправо, как можно исправить?
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 21.04.2010 в 20:48.
Marsel737 вне форума Ответить с цитированием
Старый 21.04.2010, 22:16   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
точка ставится не прямо под курсором, а смещенно вниз и вправо
Переводи координаты из экранных в оконные, метод ScreenToClient. А еще лучше пользуйся событием MouseDown, туда приходят координаты в нужном формате.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.04.2010, 23:13   #5
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Я чего-то уже перемудрил. Хочу сделать так, чтобы от предыдущей точки до курсора мыши проводилась линия, которая двигалась бы вместе в курсором. т.е. чтобы было видно как будет лежать линия после того как поставлю точку:

Код:
procedure TfrmMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  boolVBeginPaint := true;
  //intVCurPosX := X + intCDifference;
  //intVCurPosY := Y + intCDifference;
  {if frmMain.sbPaint.Down then
  begin
    Canvas.Pen.Color := clRed;
    if intVCurPosX <> 0 then
    begin
      Canvas.MoveTo(intVCurPosX, intVCurPosY);
      Canvas.LineTo(X + intCDifference, Y + intCDifference);
    end;
    intVCurPosX := X + intCDifference;
    intVCurPosY := Y + intCDifference;
  end;   }
end;

procedure TfrmMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (frmMain.sbPaint.Down) and (boolVBeginPaint = true) then
  begin
    if intVCurPosX <> 0 then
    begin
      Refresh;
      with Canvas do
      begin
        Pen.Mode := pmNot;
        Canvas.MoveTo(intVCurPosX, intVCurPosY);
        Canvas.LineTo(X+ intCDifference,Y + intCDifference);
      end;
    end;
  end;
end;

procedure TfrmMain.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  boolVBeginPaint := false;
  Canvas.Pen.Mode := pmNot;
  Canvas.MoveTo(intVCurPosX, intVCurPosY);
  Canvas.LineTo(X + intCDifference,Y + intCDifference);
  intVCurPosX := X + intCDifference;
  intVCurPosY := Y + intCDifference;
end;
Всё затирается и в добавок даже в моусуп не рисуется линия. Есть соображение - хранить изображение в битмапе и в моусуп загружать, но не получается рисовать на изображении, чтобы изображение грузить его в битмап.

Когда пытаюсь рисовать на изображении, при выполнении выдаётся ошибка на эти строки:

Код:
  imgMap.Canvas.MoveTo(intVCurPosX, intVCurPosY);
  imgMap.Canvas.LineTo(X + intCDifference,Y + intCDifference);
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 21.04.2010 в 23:15.
Marsel737 вне форума Ответить с цитированием
Старый 21.04.2010, 23:46   #6
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

сохраняй изображение в битмап при каждом рисовании линии . а в MouseMove. перед рисованием линии загружай это изображение на канву в которой рисуеш

Код:
var bmp: Tbitmap;
...
procedure TfrmMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  boolVBeginPaint := true;
  //intVCurPosX := X + intCDifference;
  //intVCurPosY := Y + intCDifference;
  if frmMain.sbPaint.Down then
  begin
    Canvas.Pen.Color := clRed;
    if intVCurPosX <> 0 then
    begin
      Canvas.MoveTo(intVCurPosX, intVCurPosY);
      Canvas.LineTo(X + intCDifference, Y + intCDifference); 
      bmp.Canvas:=Canvas;
    end;
    intVCurPosX := X + intCDifference;
    intVCurPosY := Y + intCDifference;
  end;   
end;

Код:
procedure TfrmMain.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  boolVBeginPaint := false;
  Canvas.Pen.Mode := pmNot;
  canvas.Draw(0,0,bmp);
  Canvas.MoveTo(intVCurPosX, intVCurPosY);
  Canvas.LineTo(X + intCDifference,Y + intCDifference);
  intVCurPosX := X + intCDifference;
  intVCurPosY := Y + intCDifference;
end;

Последний раз редактировалось пауэрлифтинг; 21.04.2010 в 23:54.
пауэрлифтинг вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение области на изображении, работа с образами Gonzo Мультимедиа в Delphi 10 18.12.2009 03:39
Определение границ области в изображении Manul_87 Помощь студентам 0 17.11.2009 17:38
(Pascal) Выделение произвольной области на экране bobby2008 Помощь студентам 1 29.05.2009 21:33
выделение области seregaAV110 Мультимедиа в Delphi 3 27.11.2008 21:33
выделение произвольной области на изображении seregaAV110 Помощь студентам 2 16.11.2008 11:46