Jump to content

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

16 Comments

Recommended Comments

r3h0soft

Members

Супер!

Stas

Members

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

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

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

Спасибо.

  • Administrators

Добрый день,

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

Stas

Members

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

Canvas, Bitmap?

Спасибо 

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

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

Canvas, Bitmap?

Спасибо 

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

Alex O

Members

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

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

  • Administrators

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

23 hours ago, Alex O said:

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

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

Alex O

Members

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

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

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

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

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

Dmitriy

Active subscription

(edited)

Добрый день

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

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


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

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

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

 

 

 

Edited by Dmitriy

  • Administrators
5 hours ago, Dmitriy said:

Добрый день

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

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


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

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

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

Добрый день,

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

Dmitriy

Active subscription

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

Добрый день,

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

Андроид  11

 

  • Administrators

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

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

Dmitriy

Active subscription

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

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

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

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

 

  • Administrators
2 hours ago, Dmitriy said:

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

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

Dmitriy

Active subscription

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

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

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

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

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

 

 

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

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

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

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

Recently Browsing 0

  • No registered users viewing this page.