안드로이드 개발

Exception java.lang.RuntimeException: Canvas: trying to draw too large bitmap. 간단 해결 방법

피커 2023. 1. 10. 18:53
728x90
반응형

그림파일을 많이 사용하는 앱을 개발할때 종종 발생하는 에러입니다.

 

1. 에러 문구

스택 트레이스 유형
java.lang.RuntimeException
Exception java.lang.RuntimeException: Canvas: trying to draw too large(192000000bytes) bitmap.
  at android.graphics.RecordingCanvas.throwIfCannotDraw (RecordingCanvas.java:280)
  at android.graphics.BaseRecordingCanvas.drawBitmap (BaseRecordingCanvas.java:88)
  at android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:548)
  at android.widget.ImageView.onDraw (ImageView.java:1436)
  at android.view.View.draw (View.java:22076)
  at android.view.View.updateDisplayListIfDirty (View.java:20946)
  at android.view.View.draw (View.java:21803)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4466)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4226)
  at android.view.View.draw (View.java:22080)
  at android.view.View.updateDisplayListIfDirty (View.java:20946)
  at android.view.View.draw (View.java:21803)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4466)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4226)
  at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw (ConstraintLayout.java:1994)
  at androidx.constraintlayout.motion.widget.MotionLayout.dispatchDraw (MotionLayout.java:3481)
  at android.view.View.draw (View.java:22080)
  at android.view.View.updateDisplayListIfDirty (View.java:20946)
  at android.view.View.draw (View.java:21803)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4466)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4226)
  at android.view.View.updateDisplayListIfDirty (View.java:20937)
  at android.view.View.draw (View.java:21803)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4466)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4226)
  at android.view.View.updateDisplayListIfDirty (View.java:20937)
  at android.view.View.draw (View.java:21803)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4466)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4226)
  at android.view.View.updateDisplayListIfDirty (View.java:20937)
  at android.view.View.draw (View.java:21803)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4466)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4226)
  at android.view.View.updateDisplayListIfDirty (View.java:20937)
  at android.view.View.draw (View.java:21803)
  at android.view.ViewGroup.drawChild (ViewGroup.java:4466)
  at android.view.ViewGroup.dispatchDraw (ViewGroup.java:4226)
  at android.view.View.draw (View.java:22080)
  at com.android.internal.policy.DecorView.draw (DecorView.java:832)
  at android.view.View.updateDisplayListIfDirty (View.java:20946)
  at android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:581)
  at android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:589)
  at android.view.ThreadedRenderer.draw (ThreadedRenderer.java:673)
  at android.view.ViewRootImpl.draw (ViewRootImpl.java:3910)
  at android.view.ViewRootImpl.performDraw (ViewRootImpl.java:3616)
  at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2890)
  at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1827)
  at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:8015)
  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1062)
  at android.view.Choreographer.doCallbacks (Choreographer.java:884)
  at android.view.Choreographer.doFrame (Choreographer.java:814)
  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1047)
  at android.os.Handler.handleCallback (Handler.java:883)
  at android.os.Handler.dispatchMessage (Handler.java:100)
  at android.os.Looper.loop (Looper.java:226)
  at android.app.ActivityThread.main (ActivityThread.java:7592)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:539)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:950)

 

2. 해결방법

   2.1 본인이 사용하는 그림 파일들의 사이즈를 확인하여 가능한 만큼 해상도를 줄여준다.

       /app/res/drawable에 너무 큰 사이즈의 그림파일을 사용하는지 확인하고 해상도를 줄입니다.

 

 

         간단하게 알씨에서 그림 사이즈를 줄이는 방법이 있습니다.

 

3. 관련 정보

안드로이드 공식 문서
이미지의 모양과 크기는 다양합니다. 많은 경우 이미지는 일반적인 애플리케이션 사용자 인터페이스(UI)에 비해 크기가 큽니다. 예를 들어, 시스템 갤러리 애플리케이션은 Android 기기의 카메라를 사용하여 촬영한 사진을 표시하는데 일반적으로 이러한 사진은 기기의 화면 밀도보다 해상도가 훨씬 높습니다.
제한된 메모리로 작업하는 경우 메모리에 저해상도 버전만 로드하는 것이 이상적입니다. 저해상도 버전은 이미지를 표시하는 UI 구성요소의 크기와 일치해야 합니다. 더 높은 해상도의 이미지는 특별한 이점 없이 메모리를 더 많이 차지하며 즉시 추가로 확장해야 하는 부가적인 성능 오버헤드가 발생합니다.
이 과정에서는 작게 서브 샘플링한 버전을 메모리에 로드하여 애플리케이션당 메모리 제한을 초과하지 않고 큰 비트맵을 디코딩하는 방법을 보여줍니다.
반응형