Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Работа с произвольным изображением на форме   Найти похожие ветки 

 
KIR   (2005-07-08 12:27) [0]

Народ, каким образом можно вывести на форму изображение (заренее подготовленное в графическом редакторе) произвольной формы и ловить клики на нем.


 
alex-drob   (2005-07-08 12:28) [1]

Image
Canvas


 
pasha_golub ©   (2005-07-08 12:29) [2]

В событии OnPaint


 
KIR   (2005-07-08 12:31) [3]

Как нарисовать-то понятно. Самое главное: а клики как ловить?


 
alex-drob   (2005-07-08 12:31) [4]

OnClick


 
isasa ©   (2005-07-08 12:32) [5]

OnClick
OnMouseDown
OnMouseUp
OnMouseMove


 
ferr ©   (2005-07-08 12:38) [6]

Если произвольная форма, то надо смотреть цвета под мышкой.
Если форма слишком сложная или цветастая, то надо использовать маску.


 
KIR   (2005-07-08 12:39) [7]

Народ, изображенеи ПРОИЗВОЛЬНОЙ формы. И клики нужно ловить только если они сделаны на изображении...


 
KIR   (2005-07-08 12:40) [8]

2ferr А можно поподробнее про цвета под мышкой?


 
alex-drob   (2005-07-08 12:42) [9]

canvas.Pixels возврашает цвет пикселя


 
KIR   (2005-07-08 12:49) [10]

Спас. Уже легче. Вообще у меня ситуация примерно след.:

Представьте какой-нить объект, состоящий из разных частей, напнример, знак инь-янь, в котором обе половины одного цвета, но разделены полосой. Вот как мне понять на левую половину пользователь ткул или на правую.


 
Kot Andrei ©   (2005-07-08 12:57) [11]

если нужна НЕ многоцветная карта, то контролируй цвет под курсором при клике, если всего две половины изображения и надо определить по какой из них кликнули, то имхо проще их поместить в разные image-ы.


 
ferr ©   (2005-07-08 12:59) [12]

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


 
gydvin   (2005-07-08 13:06) [13]

Дели колво занимаемых пикселей пополам и выбирай в какой зоне оказался курсорж

Например:

image.height:=10;
image.width:=10;
кидаем на канвас,
допустим с отсупом по пять пикселей сверху и слева.

тоесть когда наводим курсор на картинку выполняем следующие действия.

определяем цвет пикселя (что это действительно картинка), получаем кординаты курсора. Потом выполняем след.

a:=image.width div 2;

if x-5<a then showmessage("Левая") else showmessage("Правая");

гдето так для верха и низа также только с Y;


 
gydvin   (2005-07-08 13:21) [14]

если картинка многоцветная неиспользуй в ней только цвет фона.


 
Kolan ©   (2005-07-08 14:22) [15]

Это, по моему мнению, довольно сложная задача.
 1. Берем картинку. Допустим Инь Янь.
 2. Теперь надо разработать алгоритм, который бы в данном изображении нашел бы определенные области. В нашем случае чёрнаые и белые. На выходе такого алгоритма должен получится массив обектов( у каждого обекта есть граница). В данном случае полуим 2 загагулины (чёрную и белую) и 2 точки (чёрную и белую).
 3. Т.е. грубо говоря он работает как волшебное выделение в PhotoShop(кликнул получил область).
 4. Я думаю этот алгоритм гдето можно взять. А если картинки простые, то его можно упростить...


 
KIR   (2005-07-09 16:11) [16]

Если продолжать тему с инь-янем. Представьте, что инь-янь объемный, т.е. левая и правые части выпуклые. Тогда мне скорее требуется выложить на форме 2 картинки, соответствующие по размерам правой и левой стороне инь-яня. И по клику менять их цвет, т.е. выводит заранее заготовленные картинки только другого цвета. А у пользователя должно создаться впечатление, что просто поменялся цвет одной стороны.

Предвосхищая ответы типа: выводи заново всю картинку (просто сохрани все варианты), скажу что у моего "инь-яня" 12 частей, каждая из которых может иметь 16 цветов... страшно подумать, сколько нужно заранее заговить вариантов.


 
–=ХР=–   (2005-07-09 18:30) [17]

Вот как мне понять на левую половину пользователь ткул или на правую.

type
 TClickExEvent = procedure(ASender: TObject; AX, AY: integer; AColor: TColor) of object;

 TImageEx = class(TImage)
 private
   FOnClickEx: TClickExEvent;
 protected
   procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
 published
   property OnClickEx: TClickExEvent read FOnClickEx write FOnClickEx;
 end;

<...>

procedure TImageEx.WMLButtonUp(var Message: TWMLButtonUp);
var
 P: TPoint;
begin
 P := SmallPointToPoint(Message.Pos);
 if PtInRect(ClientRect, P) and Assigned(OnClickEx) then
   OnClickEx(Self, P.X, P.Y, Canvas.Pixels[P.X, P.Y]);
 inherited;
end;


А уже в обработчике OnClickEx делайте что Вашей душе угодно - то ли по цвету дифференцируйте, то ли по координатам, то ли по каким другим критериям  - Ваше право и не наша задача.


 
KIR   (2005-07-09 21:01) [18]

>> –=ХР=–

Это выговорите про случай, когда Image один, а мне требуется выводить несколько Image"й неправильной формы...


 
–=ХР=–   (2005-07-09 21:04) [19]

В чем проблема?


 
KIR   (2005-07-09 21:18) [20]

Как сделать инь-янь из двух Image"ей - левой половины и правой. Они же не квадратные...


 
Kolan ©   (2005-07-11 11:38) [21]


> KIR   (09.07.05 21:18) [20]

Меня не хочешь послушать?


 
KIR ©   (2005-07-11 11:44) [22]

>Kolan

А если обе части инь-яня белые?


 
Kolan ©   (2005-07-11 12:07) [23]

Ну даещь тогда это белый круг. Если они разделены черной линией то всё быдет работать. Возми открой ФотоШоп и посмотри как работает Magic Wand. Твоя задача повторить то что делает Волш. Выделение и превратьти полученную границу в обект...

Таким способом можно будет работать даже с фотками. Все зависит от качества алгоритма поиска.

А работает он наверно так:
Пусть тот же инь янь(положим что есть только 2 цвета ч. и б.). Пользователь кликнул пусть где-то всередине бклой штуки.
Смотрим какого цвета пиксель в том месте где кликнули - он белый. Добавляем его к области. Просматриваем 8 пикселей вокруг если они белые то включаем их внутрь область если чёрные не трогаем. Дальше для каждого белого пикселя все повторяется...
Делается это всё рекурсивно займет(для ч. б. варианта) сторок 20-30

PS
Оч похоже на игру сапёр. Там тотже принцип открытия ячеек. Знаещь когда на пустую тыкаещь то открывается не одна а много...
Чтобы понять возми сделай большое поле и мало мин поймещь очем я.

Могу пример для сапера скинуть если надо...


 
gydvin   (2005-07-11 12:13) [24]

KIR   (09.07.05 21:18) [20]
Как сделать инь-янь из двух Image"ей - левой половины и правой. Они же не квадратные...


Я не пойму зачем два image, рисуй на канвасе формы. примерный алгоритм определения лево и право я дал в [13]


 
KIR ©   (2005-07-11 14:04) [25]

Посмотри KIR   (09.07.05 16:11) [16]


 
Kolan ©   (2005-07-11 15:10) [26]


> KIR   (09.07.05 16:11) [16]


> левая и правые части выпуклые

Где купил 3D монитор?
Если у тебя картинка одна и таже только цет меняется. То сделай карту границ для конкретной картинки и всё.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.046 c
4-1116487085
Fedor
2005-05-19 11:18
2005.07.31
ошибка "Отказано в доступе" при вызове CreateOleObject( xxx )


1-1121319495
ANB
2005-07-14 09:38
2005.07.31
Как убрать автопереключение на главное окно при показе хинта ?


1-1121143654
Stef
2005-07-12 08:47
2005.07.31
Подсказка дня


1-1121319036
urdolphin
2005-07-14 09:30
2005.07.31
Перенаправление стандартного потока ввода вывода в Delphi


14-1120800483
Ega23
2005-07-08 09:28
2005.07.31
С днем рождения! 8 июля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский