Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi > Мультимедиа в Delphi
Регистрация

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


Ответ
 
Опции темы
Старый 23.03.2020, 00:33   #1
LexGam
 
Регистрация: 13.11.2012
Сообщений: 8
По умолчанию Рисование на картинке мышью

Всем привет.

Возникла необходимость рисовать на картинке в компоненте TImage.
У Image1 установлено свойство Stretch и Proportional в true.

На пустом компоненте рисуется без проблем в том месте где проходит курсор мыши следующим образом:

Код:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  with Image1.Canvas do begin
   Pen.Color:= clNavy;
   Pen.Width:= 10;
   MoveTo(X, Y);
 end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then Image1.Canvas.LineTo(X, Y);
end;
Проблема возникает тогда, когда в компонент Image1 загружается какая-то картинка, реальный размер которой не равен размеру Image1. Благодаря установленным свойствам она подгоняется под размеры компонента, но при этом линии перестают рисоваться в том месте где находится курсор и той тощиной, которая была установлена. К примеру рисую в центре Image, а на картинке рисуется сбоку.

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

Прошу помощи.
LexGam вне форума Ответить с цитированием
Старый 23.03.2020, 00:57   #2
LexGam
 
Регистрация: 13.11.2012
Сообщений: 8
По умолчанию

В принципе, можно сделать так, но это работает только при Proportional=false. Всётаки как это правильно сделать?

Код:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  XX,YY:double;
begin
  XX:=Image1.Picture.Width/Image1.Width;
  YY:=Image1.Picture.Height/Image1.Height;

  with Image1.Canvas do begin
   Pen.Color:= clNavy;
   Pen.Width:= 10;
   MoveTo(Round(X*XX), Round(Y*YY));
 end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  XX,YY:double;
begin
  XX:=Image1.Picture.Width/Image1.Width;
  YY:=Image1.Picture.Height/Image1.Height;

  if ssLeft in Shift then Image1.Canvas.LineTo(Round(X*XX), Round(Y*YY));

  Label1.Caption:=IntToStr(X);
  Label2.Caption:=IntToStr(Y);
end;
И ещё один вопрос. Если у Image свойство Proportional или AutoSize установлено в True, при рисовании на картинке она начинает жёстко мигать. Как от этого избавиться?

Последний раз редактировалось LexGam; 23.03.2020 в 01:42.
LexGam вне форума Ответить с цитированием
Старый 24.03.2020, 14:30   #3
LexGam
 
Регистрация: 13.11.2012
Сообщений: 8
По умолчанию

Почему нет ответов, неужели никто не сталкивался?
LexGam вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование мышью saylar_06 Общие вопросы Delphi 16 06.06.2014 08:26
Рисование на добавленной *.bmp картинке zverozavr Помощь студентам 0 21.06.2013 03:08
рисование мышью с использованием BitBlt Iosimo Win Api 17 10.04.2012 14:54
Рисование текста средствами php на картинке alexborovnikov PHP 2 15.11.2010 00:39
Как легче всего нарисовать на картинке курсор и использовать инверсивное рисование? TwiX Мультимедиа в Delphi 0 04.03.2010 21:28


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS