Jump to content

Анонс 1.11.0.0 и TfgPhotoPicker


Yaroslav Brovin

1,070 views

В следующем релизе FGX Native 1.11.0.0 будет много новых интересных возможностей, которые безусловно найдут свое место в ваших приложениях. В этой статье поговорим о первой новинке: получение фотографии с камеры или из системной галереи изображений.

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

  1. Использование напрямую камеры и разработка своего решение на базе демонстрационного проекта "Компоненты" -> "TfgCamer" -> "Фотокамера". Несмотря на то, что этот способ рабочий и он дает возможности по кастомизации внешнего вида видеоискателя, зачастую требуется просто получить фотографию от пользователя.
  2.  Использование нативного API каждой платформы для отправки запроса на получение фотографии системным приложениям.

TfgPhotoPicker

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

Чтобы отправить запрос на получение фотографии с камеры достаточно написать всего три строчки кода:

uses
  FGX.Assets, FGX.Assets.Helpers, FGX.Pickers.Photo;

procedure TFormMain.btnTakePhotoFromCameraTap(Sender: TObject);
begin
  TfgPickerPhotoFactory.PickPhotoFromCamera(btnTakePhotoFromCamera, procedure(const AFileName: TFileName) begin
    TfgAssetsManager.Current.AddBitmapFromFile('Photo', AFileName, True);
  end);
end;

Для получения фотографии из галереи:

procedure TFormMain.btnTakePhotoFromLibraryTap(Sender: TObject);
begin
  TfgPickerPhotoFactory.PickPhotoFromLibrary(btnTakePhotoFromLibrary, procedure(const AFileName: TFileName) begin
    TfgAssetsManager.Current.AddBitmapFromFile('Photo', AFileName, True);
  end);
end;

Запрос отправляет через специальную фабрику FGX.Pickers.TfgPickerPhotoFactory, которая предлагает три метода:

  TfgPickerPhotoFactory = class
  public
    /// <summary>Создает и возвращает платформенный пикер получения фотографии для ручной работы.</summary>
    /// <remarks>Удаление пикера лежит на плечах вызываемого кода.</remarks>
    class function CreatePicker(const AOwner: TObject): TfgPickerPhoto;

    /// <summary>
    ///   Иницирует получение фотографии с системного приложения камеры. Фотография возвращается в переданную
    ///   анонимную процедуру <c>AOnDidFinishPickingCallback</c>.
    /// </summary>
    /// <remarks>
    ///   Вам не требуется следить за временем жизни возвращаемого пикера. Пикер автоматически удалится после того,
    ///   как он будет закрыт пользователем.
    /// </remarks>
    class function PickPhotoFromCamera(const AOwner: TObject; const AOnDidFinishPickingCallback: TfgDidFinishPickingCallback): TfgPickerPhoto;

    /// <summary>
    ///   Иницирует получение фотографии с системного приложения галереи изображений. Фотография возвращается в
    ///   переданную анонимную процедуру <c>AOnDidFinishPickingCallback</c>.
    /// </summary>
    /// <remarks>
    ///   Вам не требуется следить за временем жизни возвращаемого пикера. Пикер автоматически удалится после того,
    ///   как он будет закрыт пользователем.
    /// </remarks>
    class function PickPhotoFromLibrary(const AOwner: TObject; const AOnDidFinishPickingCallback: TfgDidFinishPickingCallback): TfgPickerPhoto;
  end;

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

Внимание! Для корректной работы пикера на платформе Android необходимо в настройках проекта включить опцию:

Project -> Options... -> Application -> Entitlement List -> Security File Sharing = True.

Также мы подготовили демонстрационный проект, который позволит вам попробовать эту возможность самостоятельно: "Компоненты" -> "Пикеры" -> "Получение фотографии".

Всем хорошей рабочей недели. Следите за будущими анонсами FGX Native 1.11.0.0.

  • Like 14

14 Comments


Recommended Comments

Ярослав, два вопроса 

1) Вы будете учитывать возможный поворот картинки при фотографировании  ?

2)Будут ли требоваться разрешения на камеру на андроиде ?

Спасибо.

Link to comment
  • Administrators

Добрый день,

  1. После получения фотографии выполняется ее автоматический поворот, чтобы она была в правильной ориентации. Клиенту прилетает изображение с нормализованной ориентацией.
  2. Нет. Это системное приложение. Для его использования разрешение на камеру не требуется.
  • Thanks 1
Link to comment

Тогда, учитывая то, что Вы в любом случае будете вращать фотографию, не сложно ли будет добавить реализацию этого, как метод чего либо, 

Canvas, Bitmap?

Спасибо 

Link to comment
  • Administrators
14.05.2021 в 17:15, Stas сказал:

Тогда, учитывая то, что Вы в любом случае будете вращать фотографию, не сложно ли будет добавить реализацию этого, как метод чего либо, 

Canvas, Bitmap?

Спасибо 

Через релиз добавим.

Link to comment

Добрый вечер, подскажите пожалуйста, есть ли возможность задать свое имя и расположение получаемого фото при использовании PickPhotoFromCamera во время использования? 

В данный момент сохраняет в папку tmp по пути getpublicpatch и имя генерирует из guid, понятно, что можно работать и с тем что есть, но хотелось бы больше возможностей

Link to comment
  • Administrators

Добрый вечер,

23 hours ago, Alex O said:

есть ли возможность задать свое имя и расположение получаемого фото при использовании PickPhotoFromCamera во время использования? 

Нет, на текущий момент такой возможности нет. Можно выполнить ручное переименование файла уже после получения.

  • Thanks 1
Link to comment
2 минуты назад, Yaroslav Brovin сказал:

Добрый вечер,

Нет, на текущий момент такой возможности нет. Можно выполнить ручное переименование файла уже после получения.

спасибо за ответ. так и делаю. 

ЗЫ: заморачиваться и писать обертку не надо)), это я для понимания процесса работы пикера спросил

  • Like 1
Link to comment

Добрый день

добавил в демонстрационный пример TakingPhotoFromCameraDemo в процедуру LoadImages

TFile.Copy(AFileNames[I], TPath.Combine(TPath.GetSharedDocumentsPath, 'test1.jpg'));


Далее смотрю информацию о файле, и вижу что разрешение серьезно обрезано и удалена информация об устройстве.

Используется версия 1.15.2.0 

А как сохранить оригинальный файл с камеры?

 

 

 

Edited by Dmitriy
Link to comment
  • Administrators
5 hours ago, Dmitriy said:

Добрый день

добавил в демонстрационный пример TakingPhotoFromCameraDemo в процедуру LoadImages

TFile.Copy(AFileNames[I], TPath.Combine(TPath.GetSharedDocumentsPath, 'test1.jpg'));


Далее смотрю информацию о файле, и вижу что разрешение серьезно обрезано и удалена информация об устройстве.

Используется версия 1.15.2.0 

А как сохранить оригинальный файл с камеры?

Добрый день,

О какой платформе идет речь?

Link to comment
13 минут назад, Yaroslav Brovin сказал:

Добрый день,

О какой платформе идет речь?

Андроид  11

 

Link to comment
  • Administrators

Что требуется от оригинала?

  • Исходный размер
  • EXIF информация
Link to comment

я предполагал, что получу файл того разрешения, которое выбрано в элементе, то есть 4608х3456,

а получаю файл в разрешении 864х1152.

Если взять пример Camera - Camera preview, то он может записать в максимальном разрешении, 

вот я и интересуюсь, это нормальное поведение TfgPickerPhotoFactory.PickPhotoFromCamera , или нет?

 

Link to comment
  • Administrators
2 hours ago, Dmitriy said:

вот я и интересуюсь, это нормальное поведение TfgPickerPhotoFactory.PickPhotoFromCamera , или нет?

Так было запрограммировано на нашей стороне. Ограничение было связано с тем, что слабые телефоны не могут загрузить в память большие фотографии. Поэтому размер был ограничен гарантированно рабочим на всех моделях устройств. Однако, в текущий момент, это ограничение надо сделать опциональным. Чтобы пользователь мог снять это ограничение.

Link to comment
Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...