"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개의 댓글