Jump to content

Анонс 1.11.0.0 и TfgPhotoPicker


В следующем релизе 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

16 Comments


Recommended Comments

Stas

Posted

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

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

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

Спасибо.

  • Administrators
Yaroslav Brovin

Posted

Добрый день,

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

Posted

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

Canvas, Bitmap?

Спасибо 

  • Administrators
Yaroslav Brovin

Posted

14.05.2021 в 17:15, Stas сказал:

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

Canvas, Bitmap?

Спасибо 

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

Alex O

Posted

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

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

  • Administrators
Yaroslav Brovin

Posted

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

23 hours ago, Alex O said:

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

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

  • Thanks 1
Alex O

Posted

2 минуты назад, Yaroslav Brovin сказал:

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

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

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

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

  • Like 1
Dmitriy

Posted (edited)

Добрый день

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

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


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

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

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

 

 

 

Edited by Dmitriy
  • Administrators
Yaroslav Brovin

Posted

5 hours ago, Dmitriy said:

Добрый день

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

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


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

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

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

Добрый день,

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

Dmitriy

Posted

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

Добрый день,

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

Андроид  11

 

  • Administrators
Yaroslav Brovin

Posted

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

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

Posted

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

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

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

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

 

  • Administrators
Yaroslav Brovin

Posted

2 hours ago, Dmitriy said:

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

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

Dmitriy

Posted

В 09.10.2024 в 19:15, Yaroslav Brovin сказал:

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

А есть понимание в каком релизе будет реализована опциональность?

В приложении для мерчендайзеров, чтобы получить изображение максимального качества, в итоге воспользовался связкой  CameraPreivew/Camera и методом CapturePhotoAsync,

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

 

 

  • Administrators
Yaroslav Brovin

Posted

On 11/20/2024 at 4:11 PM, Dmitriy said:

А есть понимание в каком релизе будет реализована опциональность?

В 1.18.7.0 добавлено новое свойство для TfgPickerPhoto.MaxSize. Оно позволяет указать максимально допустимый размер возвращаемых изображений. Актуально только для Андроид. Если указать нулевой размер, то будет возвращено изображение в оригинальном размере. 

Чтобы воспользоваться этой настройкой, пикер нужно создавать вручную через TfgPickerPhotoFactory.CreatePicker.

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...