"Canvas: trying to draw too large(" + bitmapSize + "bytes) bitmap."

위 메시지가 나오는 상황은 DisplayListCanvas에 100MB이상의 Bitmap을 그릴 때 나오는 메시지다.

Glide를 사용하고 있음에도 불구하고 해당 메시지가 출력되는것을 확인했다.

이유는 Aspect Ratio가 아주클 때, 예를들어 아주 긴 이미지를 출력할 때 문제가 되었다. 일반적인 경우에는 문제가 되질 않지만 나의 경우 90도 이미지 회전을 위해 transform() 메서드를 사용했다. Rotate 로직이 리사이즈 된 Bitmap을 매트릭스 연산을 한 뒤 타겟뷰에 맞게 다시 늘리는 과정에서 원본이미지의 Aspect Ratio가 크다보니 어마어마하게 큰 Bitmap을 만들어버렸다.

public static Bitmap rotateImage(@NonNull Bitmap imageToOrient, int degreesToRotate) {
    Bitmap result = imageToOrient;
    try {
      if (degreesToRotate != 0) {
        Matrix matrix = new Matrix();
        matrix.setRotate(degreesToRotate);
        result = Bitmap.createBitmap(imageToOrient, 0, 0, imageToOrient.getWidth(),
            imageToOrient.getHeight(), matrix, true /*filter*/);
      }
    } catch (Exception e) {
      if (Log.isLoggable(TAG, Log.ERROR)) {
        Log.e(TAG, "Exception when trying to orient image", e);
      }
    }
    return result;
  }

해결방법은 GlideOption에 DownsampleStrategy를 적용하는 것이다.

DownsampleStrategy는 출력되는 사이즈를 보장하지는 않지만 메모리를 효율적으로 사용할 수 있도록 한다.

https://bumptech.github.io/glide/javadocs/470/com/bumptech/glide/load/resource/bitmap/DownsampleStrategy.html

 

카테고리: 미분류

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.