티스토리 뷰

문제: 특정 단말기에서 고해상도의 Bitmap을 ImageView에 설정하면 보이지 않는 현상.

원인: 

로그캣에 아래와 같은 로그를 발견할 수 있다...

설정하려는 비트맵의 크기가 텍스쳐에 업로드할 수 있는것에 비해 너무 크다는 이야기..

W/OpenGLRenderer: Bitmap too large to be uploaded into a texture (4160x2340, max=4096x4096)


다시말해 안드로이드의 하드웨어 가속 시 기본적으로 GL_MAX_TEXTURE_SIZE 만큼만 rendering을 할 수 있기  때문에 이 사이즈를 넘어가는 비트맵은 정상적으로 처리가 되지 않는다.

이다.


대책: 


1. 하드웨어 가속끄기

 수정방법: AndroidManifest.xml 에서 해당 Activity의 속성에 아래 값을 추가.

android:hardwareAccelerated="false"


하드웨어 가속을 사용해야 하는 경우라면 2번으로 수정한다.


2. 비트맵리사이징.

리사이징 메소드 만들어 봤다..


    Bitmap resizeBitmap(Bitmap  bitmap)

    {

       if(bitmap.getWidth() > GLES30.GL_MAX_TEXTURE_SIZE ||

               bitmap.getHeight()> GLES30.GL_MAX_TEXTURE_SIZE)

        {

            float aspect_ratio = ((float)bitmap.getHeight())/((float)bitmap.getWidth());

            int resizedWidth = (int)(GLES30.GL_MAX_TEXTURE_SIZE*0.9);

            int resizedHeight = (int)(GLES30.GL_MAX_TEXTURE_SIZE*0.9*aspect_ratio);


            return bitmap.createScaledBitmap(bitmap, resizedWidth, resizedHeight, false);

        }


        return bitmap;

    }


그래픽 라이브러리의 버전은 아래 사이트에서 확인가능합니다.


https://developer.android.com/guide/topics/graphics/opengl.html

OpenGL ES 1.0 and 1.1 - This API specification is supported by Android 1.0 and higher.
OpenGL ES 2.0 - This API specification is supported by Android 2.2 (API level 8) and higher.
OpenGL ES 3.0 - This API specification is supported by Android 4.3 (API level 18) and higher.
OpenGL ES 3.1 - This API specification is supported by Android 5.0 (API level 21) and higher.