Android Delphi XE7 Firemonkey-创建TBitmap表单文件会抛出ejbinexception java.lang.OutOfMemoryError

Android Delphi XE7 Firemonkey-创建TBitmap表单文件会抛出ejbinexception java.lang.OutOfMemoryError,android,delphi,firemonkey,delphi-xe7,tbitmap,Android,Delphi,Firemonkey,Delphi Xe7,Tbitmap,社区 我的问题如下: 我已经为我的KindleFire编写了一个XE7 FMX应用程序,我想在其中使用TBitmaps。 问题是,我无法从设备的存储器中创建TBitmap。 如果我在我的计算机上以Win32应用程序的形式运行该应用程序,那么一切都正常,但如果我以android应用程序的形式运行该应用程序,它会从标题中抛出异常 这是我的密码: procedure TForm1.Button1Click(Sender: TObject); var MyImage: TBitmap; Path

社区

我的问题如下:

我已经为我的KindleFire编写了一个XE7 FMX应用程序,我想在其中使用TBitmaps。 问题是,我无法从设备的存储器中创建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;
错误在哪里?
这是我的错还是delphi出了什么问题?

如果先创建位图,然后再拖出文件,是否有效:TBitmap.create(dimensions)然后LoadFromFile?

我似乎找到了一个解决已知尺寸图像的部分方法,这很可能是android的delphi XE6/XE7缺陷,因为它与IOS和Win32/64一起工作

我的应用程序使用的是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;
编辑:经过大量的测试和研究(还有哭泣),我发现两件事解决了我的问题

tb:=TBitmap.CreateFromFile('img.png');
这将根据文件的大小创建位图。第二个解决方案(似乎是主要问题)是我试图从线程中创建和加载位图。 要解决这个问题,我将负载放入线程队列或同步

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

我想TBitmap库在android平台上不是线程安全的。

我通过将“版本信息”部分中的选项“largeHeap”从“False”更改为“True”,解决了同样的问题


此后不再出现OutOfMemoryError。

图像有多大?如果它非常大,可能超出了应用程序的内存限制。请告诉我们它的大小和文件大小。顺便说一句,提供一个简短的演示程序做得很好-很多人都没有。看到有人投入这样的调试工作,特别是在Repeatin上,这真是太好了我的测试图像非常小。文件大小为8KB,图像大小为290p*250p。我只画了一个随意的黑色“a”“。没有透明度或特别的东西。我不知道为什么这个测试图像不能加载。如果我把所有这些东西放在一起,我开始相信这是Delphi内部的错误,而不是我的错。如果是这样的话,我有一个大问题,因为我需要这个来工作……试着在Google+group、Delphi iOS和Android开发者上发布一个链接,链接到完整的示例项目,包括有问题的图片。也许有人能帮助你。我敢肯定,位图在Android上确实有效,所以……因为这不是问题的实际答案,所以最好将其作为原始帖子的评论发布。答案应该留给更明确的回答。我知道,但我没有足够的声誉来评论。如果可以,请随意移动它
TThread.queue(nil,
 procedure
      begin
          tb:=TBitmap.CreateFromFile('img.png');
      end);