2014-11-07 5 views
2

커뮤니티를 던졌습니다 TBitmap으로 작업하십시오. 문제는, 장치의 저장소에서 TBitmap을 만들 수 없다는 것입니다. 내 컴퓨터에서 Win32-app로 응용 프로그램을 실행하면 모두 작동하지만, android-app로 실행하면 제목에서 예외가 발생합니다.델파이 XE7 Firemonkey은은 TBitmap 양식 파일 작성</p> <p>내 문제는 다음이다 EJNIException java.lang.OutOfMemoryError와

여기 내 코드입니다 :

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; 

이 코드는 아무 의미가 없습니다 그러나 이것은 단지 테스트 프로그램입니다. 이것이 작동하면 주 프로그램에서 사용할 수 있지만 이미이 시점에서 실패합니다. 여기

(그리고 난 이미 그가 FMX.Graphics.TBitmap 아닌 VCL을 사용하는 것을 확인했다) 내 스택입니다 :

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 

오류는가? 내 잘못입니까, 아니면 델파이 뭔가 잘못 됐나요?

+0

이미지의 크기는 어느 정도입니까? 매우 큰 경우 앱의 메모리 한도를 초과 할 수 있습니다. 크기 및 파일 크기를 알려주십시오. –

+0

Btw 짧은 데모 프로그램을 제공하기위한 훌륭한 작업 - 많은 사람들이하지 않습니다. 특히 작은 테스트/데모에서 재생산을 위해 누군가가 이와 같이 디버깅 작업을하는 것을 보는 것이 좋습니다. 잘 했어 +1. –

+0

테스트 이미지가 매우 작습니다. 파일 크기는 8KB이고 이미지 크기는 290p * 250p입니다. 나는 캐주얼 블랙 "A"페인트로 그렸습니다. 투명성이나 특별한 것이 없습니다. 이 테스트 이미지를로드 할 수없는 이유를 모르겠습니다. – Adam

답변

0

먼저 비트 맵을 만들고 나중에 파일을 로프하면 작동합니까? TBitmap.Create (dimensions)? LoadFromFile?

+0

이 질문에 대한 실제 답변이 아니기 때문에 원래 게시물에 댓글로 게시하는 것이 훨씬 더 좋습니다. 보다 확실한 응답을 위해서는 응답을 예약해야합니다. – Seventoes

+0

나는 알고있다. 그러나 나는 충분히 평판을 논평하지 않았다. 가능하다면 자유롭게 이동하십시오. – lechonex

1

알려진 치수의 이미지를 부분적으로 찾은 것 같았습니다. IOS 및 Win32/64에서 작동하는 Android 용 델파이 XE6/XE7 버그 일 수 있습니까?

내 SDK가 최소 SDK 10 세트로 작동 했으므로 SDK를 15 이상으로 변경했는데 위와 동일한 오류가 계속 발생했으며 XE7에서는 예외 문자열 "Bitmap too large"이 계속 나타납니다. 크기를 정확하게 파일 크기로 지정하면 작동하지만, 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'); 

이렇게하면 파일 크기에 따라 비트 맵이 만들어집니다. 주요 문제로 보이는 두 번째 해결 방법은 스레드 내에서 비트 맵을 만들고로드하려고한다는 사실입니다. 내가 스레드 큐에 부하를 넣어 해결하거나

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

난은 TBitmap 라이브러리가 안드로이드 플랫폼에서 스레드로부터 안전하지 않습니다 상상 동기화합니다.

0

"버전 정보"섹션의 "largeHeap"옵션을 "False"에서 "True"로 변경하여 동일한 문제를 해결했습니다.

더 이상 OutOfMemoryError가 없습니다.