2

コミュニティ、

私の問題は次のとおりです。

TBitmaps を使用したい Kindle Fire 用の XE7 FMX アプリケーションを作成しました。問題は、デバイスのストレージから TBitmap を作成できないことです。アプリケーションを自分のコンピューターで Win32 アプリとして実行するとすべて動作しますが、Android アプリとして実行すると、タイトルから例外がスローされます。

これが私のコードです:

procedure TForm1.Button1Click(Sender: TObject);
var
  MyImage: TBitmap;
  Path: String;
begin
  Path := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'test.png';
  if TFile.Exists(path, true) then
  begin
    MyImage := TBitmap.CreateFromFile(path);        //<- Here it fails
  end;
end;

このコードは意味がありませんが、これは単なるテスト プログラムです。これが機能する場合、メイン プログラムで使用できますが、この時点で既に失敗しています。(そして、彼が VCL ではなく FMX.Graphics.TBitmap を使用していることを既に確認しています)

これが私のスタックです:

System._DbgExcNotify(86,0x11fc0b0,0x5bf3b0dd,0x11fc0b0,0x5bf3b0dd)
System.NotifyReRaise(0x11fc0b0,0x5bf3b0dd)
System._RaiseAtExcept(0x11fc0b0,0x5bf3b0dd)
System._RaiseExcept(0x11fc0b0)
System.Internal.Excutils.DoRaiseJNIExceptionCallBack('class java.lang.OutOfMemoryError','java.lang.OutOfMemoryError')
Androidapi.Jni.HandleJNIException(0xbe42f8)
Androidapi.Jnimarshal.ExecJNI(0x5d226490,0x125e998)
:5C8B8A14 DispatchToImport
:5C8C4FA8 dispatch_first_stage_intercept
Fmx.Graphics.Android.TBitmapCodecAndroid.LoadFromFile(0x127e7f8,'/data/data/com.embarcadero.Project1/files/test.png',0x1297040,4096)
Fmx.Graphics.TBitmapCodecManager.LoadFromFile(0x5cbab65c,'/data/data/com.embarcadero.Project1/files/test.png',0x1297040,4096)
Fmx.Graphics.TBitmap.LoadFromFile(0x127e788,'/data/data/com.embarcadero.Project1/files/test.png')
Fmx.Graphics.TBitmap.TBitmap(0x127e788,1,'/data/data/com.embarcadero.Project1/files/test.png')
Unit1.TForm1.Button1Click(0xad1c48,0x103dbd8)
[...] rest is unneccessary

エラーはどこにありますか? それは私のせいですか、それともデルフィに何か問題がありましたか?

4

3 に答える 3

1

既知の寸法の画像の解決策を部分的に見つけたようです。これは、IOS および Win32/64 で動作するため、Android の Delphi XE6/XE7 バグである可能性が非常に高いですか?

私のアプリはMin-SDK 10セットで動作し、SDK 15以上に変更したため、上記と同じエラーが発生し続け、XE7では例外文字列「ビットマップが大きすぎます。」正確にファイルの寸法で寸法を指定した場合、それは機能しますが、png をロードし、それが異なるサイズ (小さいまたは大きい) の場合、動的に「ビットマップが大きすぎます」と表示されます。SDK 10 では、寸法なしでビットマップを作成できたようですが、寸法なしで試してみると 15 > 読み込まれません。

これは、ファイルの正確なサイズがわかっている限り、任意のサイズの画像ファイルで機能します。

 bmpscale:=1024;
try
    tb := TBitmap.Create(bmpscale,bmpscale);
    tb.LoadFromFile('img.png');
finally
    freeandnil(tb)
end;

編集:多くのテストと調査(そして涙)の後、問題を解決する2つのことがわかりました。

tb:=TBitmap.CreateFromFile('img.png');

これにより、ファイルのサイズに従ってビットマップが作成されます。主な問題と思われる 2 番目の解決策は、スレッド内からビットマップを作成してロードしようとしていたという事実です。解決するには、負荷をスレッドキューに入れるか、同期します

TThread.queue(nil,
 procedure
      begin
          tb:=TBitmap.CreateFromFile('img.png');
      end);

Androidプラットフォームでは、TBitmapライブラリはスレッドセーフではないと思います。

于 2014-11-13T12:25:25.773 に答える
0

最初にビットマップを作成し、後でファイルをローフすると機能しますか: TBitmap.Create(dimensions) と LoadFromFile?

于 2014-11-12T15:39:12.327 に答える