Форум программистов, компьютерный форум, киберфорум
Delphi: FireMonkey
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
-5 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 139
1

Определение Timage под мышью

25.09.2019, 15:05. Показов 1969. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Определение Timage под мышью

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

При клике мышкой, нужно определить по какой области, где есть рисунок, мы попали.
Как это лучше реализовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2019, 15:05
Ответы с готовыми решениями:

Компонент TImage ведет себя по разному под 98 и 2000!
Очень странная штука с TImage ! Программа сделана в Borland C++Builder5 - 'родной брат делфи' под...

Мерцание компонента Timage и перемещение Timage при нажатии
Здравствуйте! Помогите убрать мерцание компонента Timage при изменении размера. Нашел в...

Определение полигона под мышью
Есть полигон на экране. Нужно определить, когда курсор мыши наведен на него. Пробовал так: ...

Перемещение Timage мышью
У меня на форме есть картинка как мне её перемещать мышкой? Заранее спасибо!

12
-5 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 139
25.09.2019, 15:29  [ТС] 2
Вижу тут два шага к решению:
1) На OnMouseDown

Определяем какие компоненты TIMAGE находятся под мышью
Что то вроде
Delphi
1
2
3
4
5
6
7
8
9
 for i:=0 to TFrame2_maps.ComponentCount-1 do
  if (TFrame2_maps.Components[i] is Timage) and
  (
  (TFrame2_maps.Components[i].left<=X and TFrame2_maps.Components[i].left+TFrame2_maps.Components[i].width>=X )
and (TFrame2_maps.Components[i].top<=y and TFrame2_maps.Components[i].top+TFrame2_maps.Components[i].heigth>=y)
)
 
 
  then showmessage(TFrame2_maps.Components[i].Name);
2) берем все найденные компоненты и проверяем их на прозрачность в этой точке
Delphi
1
???
Нужна помощь.
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
25.09.2019, 15:45 3
так... У вас FMX. Вы используете компоненты TImage. Откуда и как в них появляются изображения, в каком формате? И что такое TFrame2_maps?

Добавлено через 2 минуты
И если что есть такая функция - PtInRect()...
0
-5 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 139
25.09.2019, 16:13  [ТС] 4
GoodWeather,
так... У вас FMX. Вы используете компоненты TImage. Откуда и как в них появляются изображения, в каком формате? И что такое TFrame2_maps?
У меня не форма, внутри которой фреймы. TFrame2_maps - это название одного из них.

Спасибо за наводку. Поставил так.
Delphi
1
2
3
4
5
6
7
procedure TFrame2_maps.Image1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Single);
  var
  i:integer;
begin
    for i:=0 to TFrame2_maps.ComponentCount-1 do
  if (TFrame2_maps.Components[i] is Timage) and  PtInRect(TFrame2_maps.Components[i], point(x,y))
он ругается на
[DCC Error] Fr2_Maps.pas(251): E2233 Property 'ComponentCount' inaccessible here

[DCC Error] Fr2_Maps.pas(252): E2010 Incompatible types: 'Integer' and 'Single'
1)Что не так?

2) наши координаты должны быть абсолютными?

3) Как определить прозрачность TIMAGE в этой точке?

Добавлено через 15 минут
Delphi
1
2
3
 for i:=0 to Frame2maps.ComponentCount-1 do
  if (Frame2maps.Components[i] is Timage) and  PtInRect(Frame2maps.Components[i], point(round(x),round(y)))
  then showmessage(Frame2maps.Components[i].Name);
Так ругается что PtINRect не может быть вызвана с этими аргументами.
Сlienttoscreen - не катируется
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
26.09.2019, 09:29 5
вернемся еще раз к теме определения прозрачности пиксела в TBitmap
идем в исходники и находим вот такое например
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TBitmap.ReplaceOpaqueColor(const Color: TAlphaColor);
var
  I, J: Integer;
  M: TBitmapData;
  C: PAlphaColorRec;
begin
  if Map(TMapAccess.ReadWrite, M) then
  try
    for J := 0 to Height - 1 do
      for I := 0 to Width - 1 do
      begin
        C := @PAlphaColorArray(M.Data)[J * (M.Pitch div 4) + I];
        if C^.A > 0 then
          C^.Color := PremultiplyAlpha(MakeColor(Color, C^.A / $FF));
      end;
  finally
    Unmap(M);
  end;
end;
тут IF занимается РОВНО определением, прозрачный пиксель или нет
вам остается только использовать
0
-5 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 139
26.09.2019, 16:08  [ТС] 6
krapotkin,
Delphi
1
2
 C := @PAlphaColorArray(M.Data)[J * (M.Pitch div 4) + I];
        if C^.A > 0 then
Если C^.A > 0 это значит что не прозрачное. Верно понял код?

вопрос: откуда приходит const Color: TAlphaColor и чему она должна быть равна

и что за А?
Delphi
1
C^.A
в моем случае, использования TIMAGE

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if image2.Bitmap.Map(TMapAccess.ReadWrite, M) then
  try
    for J := 0 to Height - 1 do
      for I := 0 to Width - 1 do
      begin
        C := @PAlphaColorArray(M.Data)[J * (M.Pitch div 4) + I];
        if C^.A > 0 then
        showmessage('цвет');
      end;
  //finally
  except
         showmessage('Ошибка');
 
     // Unmap(M);
 
  end;
Ему не понятна @PAlphaColorArray, которая ниоткуда не приходит
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
27.09.2019, 10:58 7
это тип - PAlphaColorArray = ^TAlphaColorArray

запись PAlphaColorArray(M.Data) - это приведение типа указателя m.Data - компилятор будет считать что M.Data это PAlphaColorArray
@ - это взятие указателя,
т.е. получаем что C = указатель на элемент массива TAlphaColorArray с индексом J * (M.Pitch div 4) + I
C^ - сам элемент этого массива

C^.A соответственно - это байт-прозрачность. $ff - совсем непрозрачная точка, $00 - совсем прозрачная

Добавлено через 1 минуту
кстати, насколько я помню ^ можно не писать
C^.A должно быть одинаково с C.A
0
-5 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 139
27.09.2019, 11:47  [ТС] 8
krapotkin,

Хорошо. Услышал.
Для проверки сделал следующий код:
кликаем. Смотрит куда пришлось. и показываем цвет.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
procedure TFrame2_maps.Image1_PenzaMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
  
  r,g,b: byte;
  I, J: Integer;
  M: TBitmapData;
  C: TAlphaColor;
begin
 ShowMessage('координаты : X=' + floatToStr(X) +
              ' Y=' + floatToStr(Y));
   if image1_penza.Bitmap.Map(TMapAccess.ReadWrite, M) then
  try
  
 
        C := M.GetPixel(round(x),round(y)) ;
        
 
          showmessage('цвет'+ AlphaColortostring(C));
 
  except
         showmessage('Ошибка');
 
end;
 
end;
NIL случается очень редко. В основном какие то данные.
Все что не синее - прозрачное.

Как В чем нюанс?!
Миниатюры
Определение Timage под мышью  
0
-5 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 139
27.09.2019, 11:53  [ТС] 9
Поправка *Null
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
27.09.2019, 12:31 10
потому что внимательнее надо читать
и вообще читать документацию по функциям, которые использованы
Вложения
Тип файла: 7z imgAlpha.7z (5.09 Мб, 9 просмотров)
0
-5 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 139
27.09.2019, 12:53  [ТС] 11
krapotkin,
Не вижу разницы в коде у себя и у Вас. Поясните.

Взял ваш проект - работает отлично.
Вставил свою картинку- дает неверный цвет.
Миниатюры
Определение Timage под мышью  
Вложения
Тип файла: rar imgAlpha.rar (2.16 Мб, 9 просмотров)
0
-5 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 139
27.09.2019, 12:54  [ТС] 12
Отдельно прикладываю регион.
Возможно проблема в картинке?
Изображения
 
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
27.09.2019, 13:28 13
вообще TImage не целиком состоит из битмапа
есть еще неотображаемая часть
предположу, что при клике на битмап мы получаем нормальные результаты
а когда попадаем мимо - любые
это косвенно подтвверждается, если покликать на мою программу
так что нужно еще проверять попали XY в Bitmap.Width,Height или нет

Цитата Сообщение от 2icER Посмотреть сообщение
Не вижу разницы в коде
а я вижу )
как минимум MAP требует прибирать за собой и писать Unmap

кроме того, ну вставьте свою картинку в мой код, да смотрите
0
27.09.2019, 13:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2019, 13:28
Помогаю со студенческими работами здесь

Определение момента пересечения изображения мышью (прозрачность)
Есть некоторое изображение, у которого есть альфа-канал, используемый для фона. Само изображение ни...

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

Выполнить определение цвета пикселя при вождении мышкой по компоненту TImage
В программе мне необходимо выполнять определение цвета пикселя при вождении мышкой по компоненту...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru