2017-09-29 14 views
0

アンドロイドの下で、ギャラリーから画像を選択すると、代わりに拡張子が付いたファイル名がuriではなく、contentproviderを使用してローカルディレクトリの1つにファイルをコピーする必要があります。拡張子のないファイルをTbitmapでロードするには?

ファイルには拡張子がないので、Tbitmapオブジェクトにどのようにロードするのですか?私はしようとするが、私はエラーが表示されます:イメージを読み込むことはできません。

+1

何TBitmap.CreateFromFileは?これは内部的に異なるシグネチャ(gif、bmp、png、tiff、jpg)を探し、それに応じてファイル形式を読み込んで変換します。 –

答えて

1

[OK]を私は次のようでした:

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; 
+0

定数のヘッダバイト配列を 'CompareMem'で比較すると、(仮想マシンを起動してFMXを確認するのは遅いですが)うまくいくと思います。アイデアは、長さが固定のヘッダーバイト配列を宣言して、少ないコードで比較および検出することです。 – Victoria

関連する問題