Delphi 如何在Tbitmap中加载没有任何扩展名的文件?

Delphi 如何在Tbitmap中加载没有任何扩展名的文件?,delphi,firemonkey,Delphi,Firemonkey,在android下,当我们从图库中选择图像时,我们不会收到扩展名为的文件名,而是一个uri,我们必须使用contentprovider将文件复制到本地目录中 现在,由于文件没有任何扩展名,如何将其加载到Tbitmap对象中?我尝试了,但收到一个错误:无法加载图像。好的,我这样做了: function DetectImageExtension(const aFileName: string): String; var aFileStream: TFileStream; aFirstByt

在android下,当我们从图库中选择图像时,我们不会收到扩展名为的文件名,而是一个uri,我们必须使用contentprovider将文件复制到本地目录中

现在,由于文件没有任何扩展名,如何将其加载到Tbitmap对象中?我尝试了,但收到一个错误:无法加载图像。

好的,我这样做了:

function  DetectImageExtension(const aFileName: string): String;
var aFileStream: TFileStream;
    aFirstBytes: Tbytes;
begin
  aFileStream := TFileStream.Create(aFileName, fmOpenRead);
  try
    if aFileStream.Size < 8 then exit('');
    SetLength(aFirstBytes, 8);
    aFileStream.ReadBuffer(aFirstBytes[0], length(aFirstBytes));
    if (aFirstBytes[0] = $FF) and
       (aFirstBytes[1] = $D8) then result := 'jpg'  // ÿØ
    else if (aFirstBytes[0] = $89) and
            (aFirstBytes[1] = $50) and
            (aFirstBytes[2] = $4E) and
            (aFirstBytes[3] = $47) and
            (aFirstBytes[4] = $0D) and
            (aFirstBytes[5] = $0A) and
            (aFirstBytes[6] = $1A ) and
            (aFirstBytes[7] = $0A) then result := 'png' // .PNG....
    else if (aFirstBytes[0] = $47) and
            (aFirstBytes[1] = $49) and
            (aFirstBytes[2] = $46) then result := 'gif' // GIF
    else if (aFirstBytes[0] = $42) and
            (aFirstBytes[1] = $4D) then result := 'bmp' // BM
    else result := '';
  finally
    aFileStream.Free;
  end;
end;

那么TBitmap.CreateFromFile呢?它在内部查找不同的签名gif、bmp、png、tiff、jpg,然后相应地加载和转换文件格式。我想,通过CompareMem比较常量头字节数组同样可以在FMX上启动虚拟机进行验证。其思想是声明固定的头字节数组及其长度,以便用更少的代码进行比较和检测。