Delphi: Как пометить фотографии, как это делает Facebook - PullRequest
0 голосов
/ 01 апреля 2009

Мне нужен способ пометить фотографии в настольном приложении Delphi, как это делает Facebook.

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

Два предложения в ответе на этот вопрос: « Delphi Components для идентификации и маркировки лиц » не решают эту проблему.

Но я понятия не имею, с чего начать, и не смог найти идей в Интернете о том, как это сделать. Как это делает Facebook? Или, может быть, есть компонент для Delphi, который позволит это.

Как лучше всего реализовать тегирование, подобное Facebook?


p.s. Вот некоторые из определений API Facebook для этого: http://wiki.developers.facebook.com/index.php/Photos.addTag

Вот Java-программа, которая реализует функциональность тегов лица, которую я хочу сделать в своем приложении Delphi: fb-photo-uploader

Ответы [ 4 ]

4 голосов
/ 01 апреля 2009

Ключевыми параметрами API, который вы указали, являются идентификатор изображения, координаты и тег. Тег может быть либо идентификатором пользователя Facebook, либо текстом произвольной формы (для случая, когда помеченный объект не является пользователем Facebook). Facebook использует только одну координату, потому что он использует регионы фиксированного размера для обозначения отмеченной области; идея заключается в том, что вы нажимаете на центр лица человека, и Facebook просто сохраняет эту точку.

Если вы отображаете изображение в элементе управления TImage (в конце концов, это очевидный первый вариант), вы можете обнаружить щелчки мыши с помощью событий OnMouseDown и OnMouseUp. (Событие OnClick проще, но не сообщает вам координаты.) После того, как вы получили точку, попросите метку сопровождать эту точку. Вы можете использовать предопределенные ярлыки, такие как идентификаторы пользователей Facebook, или просто использовать обычный текст, или использовать что-то свое. Вопрос о том, что вы используете для представления значения тега, является ортогональным к любым другим вопросам, которые вы задавали до сих пор.

Другая половина тегов фотографий Facebook состоит в том, что при наведении курсора мыши на изображение отображается текст тега поверх изображения, а при наведении курсора мыши на метки ниже выделяются связанные области. Обрабатывайте OnMouseMove события и пишите некоторый код для отображения или скрытия надписей и фигур в зависимости от ситуации. Если вы используете TLabel и TShape, вам, возможно, даже не придется изменять изображение, но показ этих элементов управления в верхней части изображения может помешать дальнейшим событиям OnMouseMove для изображения. Это не должно занять много времени, чтобы попробовать некоторые эксперименты и посмотреть, что работает для вас.

3 голосов
/ 01 апреля 2009

lkessler, я только что прочитал ваш ответ Маршаллу Фрайману, поэтому у вас может быть пара вариантов:

THotSpotImage - Если у вас уже есть компоненты TMS ...

ImageEn - если они у вас уже есть ...

См. w2m's answer # 3 Я думаю, в дальнейшем мне нужно получить все внутренние пиксели моего выбора, поэтому как я могу сохранить свои выборы / объекты?

Сохранить выделение только сохраняет само выделение. Не сохраняет изображение внутри выбора:

процедура SaveSelectionToFile (const FileName: string); SaveSelectionToFile сохраняет текущий выбор в указанный файл. пример ImageEnView1.Select (10,10,100,100); ImageEnView1.SaveSelectionToFile ( 'Вариант1'); .. sel1.Position: = 0; ImageEnView1.LoadSelectionFromFile ( 'Вариант1'); // это как Выберите (10,10,100,100)

0 голосов
/ 02 апреля 2009

В библиотеке Graphic32 на изображении может быть несколько слоев друг над другом. Один из слоев, который предоставляется «из коробки», - это TRubberbandLayer , который позволяет пользователю перемещать / изменять размер слоя во время выполнения.

Событие mousemove для компонента TImage32, имеет параметр, который дает слой, находящийся в данный момент под курсором.

type TImgMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer) of object;

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

0 голосов
/ 01 апреля 2009

Я немного сбит с толку относительно вашего вопроса. Вы пытаетесь взаимодействовать с Facebook или просто скопировать функциональность?

Если вы пытаетесь скопировать функциональность: Вы должны иметь возможность просто отобразить изображение, позволить пользователю выбрать прямоугольник, возможно скопировать изображение в новую копию, чтобы уведомить об этом другого человека, и применить тег в БД. Некоторые полезные ссылки: здесь - это пример выбранного изображения, а здесь - пример части изображения для копирования. На самом деле, я думаю, что вы можете сделать выделенное изображение в коробке с красками, но на самом деле не играли с одним из них вечно.

Если вы пытаетесь получить доступ к API: интерфейс .NET может работать для вас. Насколько я могу судить, COM-интерфейс отсутствует, поэтому вам придется написать собственный коннектор или использовать приложение .NET Delphi. Примечание: вся эта информация исходит от Google, поэтому я не буду клясться, что это действительно текущее положение вещей. Единственный другой запрос Facebook API, который я видел, был с 2007 года.

Если вы хотите сделать автоматическое распознавание лиц, OpenCV из упомянутого вопроса выглядит как достойный способ сделать это (особенно если у вас есть доступ к C ++ Builder).

...