1

일부 이미지를 ImageView에 표시해야합니다. 그들 중 일부는 내가이 상황을 감지하기 위해이 방법을 사용하는 나에게Android Lollipop에서 해상도가 너무 높은지 감지합니다.

W/OpenGLRenderer﹕ Bitmap too large to be uploaded into a texture (3744x5616, max=4096x4096) 

을 제공 너무 높은 해상도있을 수 있습니다

public boolean isResTooHigh() { 
    int[] maxSize = new int[1]; 
    GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0); 

    return (maxSize[0] < width) || (maxSize[0] < height); 
} 

폭과 높이가 사진의 소스에 의해 제공됩니다.

하지만 Lollipop 및 내 에뮬레이터를 실행하는 Nexus 4에서는 maxSize [0]이 항상 0입니다. 그럼이 문제를 어떻게 감지합니까?

+0

이 호출 후에 마지막으로 열린 opengl 오류를 확인 했습니까? – Selvin

+0

"W/OpenGLRenderer : 텍스처에 업로드하기에 너무 큰 비트 맵 (3744x5616, 최대 = 4096x4096)"이 유일한 오류입니다. – andrew

+0

glGetIntegerv ... 이후 http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html#glGetError() – Selvin

답변

1

해당 GL 쿼리 스레드에서 활성 GL 컨텍스트가 필요합니다. 이전에는 실수로 프레임 워크의 개인 GL 컨텍스트를 사용하여 해당 쿼리를 수행했습니다. 다양한 아키텍처 변경으로 인해 Lollipop에서이 컨텍스트는 더 이상 응용 프로그램 코드로 누출되지 않으므로 이제 쿼리가 실패합니다. logcat을 살펴보면 "현재 컨텍스트가없는 OpenGL es api를 호출하십시오"와 같은 내용이 표시됩니다.

원하는 경우 사용자 고유의 GL 컨텍스트를 만들어 해당 쿼리를 수행 할 수 있습니다. 또는 화면 해상도가 최대라고 가정하거나 타일 방식과 같은 확장 가능한 솔루션을 사용할 수 있습니다.

+0

그래서 Lollipop +에서는 사용할 수 없습니다. 감사. – andrew

+0

자세한 내용은 여기를 참조하십시오. http://stackoverflow.com/a/27092070/199364 – ToolmakerSteve

1

기술적으로 화면 크기 이하의 단일 비트 맵만 렌더링 할 수 있습니다. 하드웨어에 따라 더 큰 값을 렌더링 할 수는 있지만 예측할 수는 없습니다. 그리고 말했듯이, 실제로 보장 할 수있는 것은 화면의 크기 (또는 그보다 작은 크기)를 렌더링 할 수 있다는 것입니다.

큰 이미지를 표시하려면 UI를 타일로 나눕니다. 각 타일은 어느 한 크기의 화면보다 크지 않습니다.

+0

표시 할 수 없다는 것을 알고 있습니다. 그들. 사진의 크기가 너무 크면 단순히 표시하지 않습니다. 하지만 크기가 너무 커지면 알아야합니다. – andrew

+0

정말 알 수 없습니다. 그냥 항상보기를 256x256 또는 512x512 타일로 나누고 그런 식으로 모든 것을 처리하십시오. 귀하의 사용자 감사합니다! – ctate

+0

타일링 된보기의 경우 256x256 또는 512x512 타일을 더 많이 사용하고 싶을 것입니다. 이 라이브러리는 다음과 같습니다 (https://github.com/davemorrissey/subsampling-scale-image-view).이를 위해 SubsamplingScaleImageView가 제공됩니다. –

관련 문제