使用IFMXCameraService.TakePhoto,有没有办法获取图像路径?

时间:2017-02-14 06:43:31

标签: firemonkey delphi-10.1-berlin

这是我正在使用的代码。

procedure TForm1.getpic;
var
  Service: IFMXCameraService;
  Params: TParamsPhotoQuery;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXCameraService,
    Service) then
  begin
    Params.Editable := false;
    Params.NeedSaveToAlbum := True;
    Params.RequiredResolution := TSize.Create(640,640);
    Params.OnDidFinishTaking := DoDidFinishTakePic;
    Service.TakePhoto(nil, Params);
  end
  else
    xShowMessage('This device does not support the camera service');
end;

procedure TForm1.DoDidFinishTakePic(Image: TBitmap);
var
  Imagepath:string;
begin
  Image1.Bitmap.Assign(Image);
  Imagepath := fmx.platform.TMessageReceivedImagePath;
end;

显然来自:

  

http://docwiki.embarcadero.com/RADStudio/en/List_of_FireMonkey_Message_Types

在fmx.platform中找到了TMessageReceivedImagePath。 但是我无法在任何地方找到它。我正在使用10.1柏林更新2.我在Embarcadero论坛上发布了这个(感谢Remy的答案),但我希望有人在这里有答案。

PS /我还想存储拍摄照片的日期时间。

与此同时,我有一个解决方法,但它很难看,而且我肯定不会因为拍摄照片的第二精度计时而一直工作。

procedure TForm1.DoDidFinishTakePic(Image: TBitmap);
var
  Imagepath:string;
begin
  Image1.Bitmap.Assign(Image);
  st := datetimetostr(System.SysUtils.Now,xfs);
  Imagepath := 'IMG_'+copy(st,1,4)+copy(st,6,2)+copy(st,9,2)+'_'+copy(st,12,2)+copy(st,15,2)+copy(st,18,2)+'.jpg';
end;

1 个答案:

答案 0 :(得分:2)

正如我在https://github.com/codahale/bcrypt-ruby/issues/116上所述,您所要做的就是订阅TMessageReceivedImagePath消息,例如:

TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedImagePath, DoMessageListener);

...

procedure TForm1.DoMessageListener(const Sender: TObject; const M: TMessage);
var
  ImagePath: string;
begin
  if M is TMessageReceivedImagePath then
  begin
    ImagePath := TMessageReceivedImagePath(M).Value;
    ...
  end;
end;

Embarcadero文档消息在FMX.Platform单元中。如果您在那里找不到它,请检查它是否在FMX.Platform.Android单元(因为它是特定于Android的消息)或FMX.MediaLibrary单元(定义其他照片/视频捕获消息)