Estou carregando um bitmap em um ImageView e vendo esse erro. Entendo que esse limite se refere a um limite de tamanho para texturas de hardware OpenGL (2048x2048). A imagem que preciso carregar é uma imagem com zoom de pitada de cerca de 4.000 pixels de altura.
Tentei desativar a aceleração de hardware no manifesto, mas sem alegria.
<application
android:hardwareAccelerated="false"
....
>
É possível carregar uma imagem maior que 2048 pixels em um ImageView?
inSampleSize
abordagem.Respostas:
Toda a renderização é baseada no OpenGL; portanto, você não pode ultrapassar esse limite (
GL_MAX_TEXTURE_SIZE
depende do dispositivo, mas o mínimo é 2048x2048; portanto, qualquer imagem menor que 2048x2048 será adequada).Com imagens tão grandes, se você quiser diminuir o zoom e em um celular, configure um sistema semelhante ao que vê no google maps, por exemplo. Com a imagem dividida em várias partes e várias definições.
Ou você pode reduzir a imagem antes de exibi-la (consulte a resposta do usuário1352407 nesta pergunta).
Além disso, tenha cuidado com a pasta em que você coloca a imagem, o Android pode ampliar automaticamente as imagens. Dê uma olhada na resposta de Pilot_51 abaixo sobre esta questão.
fonte
Esta não é uma resposta direta à pergunta (carregamento de imagens> 2048), mas uma solução possível para qualquer pessoa que esteja enfrentando o erro.
No meu caso, a imagem era menor que 2048 em ambas as dimensões (1280x727, para ser exato) e o problema ocorreu especificamente no Galaxy Nexus. A imagem estava na
drawable
pasta e nenhuma das pastas qualificadas. O Android assume que os drawables sem um qualificador de densidade sejam mdpi e os dimensione para cima ou para baixo para outras densidades; nesse caso, aumentado em 2x para xhdpi. Mover a imagem do culpadodrawable-nodpi
para evitar o dimensionamento resolveu o problema.fonte
drawable
essencialmente umadrawable-mdpi
pasta oculta . Isso também explicava por que meus marcadores de mapa personalizados pareciam horríveis (eles estavam sendo aumentados e reduzidos).Eu reduzi a imagem desta maneira:
fonte
ctx
significa?Em vez de gastar horas e horas tentando escrever / depurar todo esse código de redução de amostragem manualmente, por que não usar
Picasso
? Foi feito para lidar combitmaps
todos os tipos e / ou tamanhos.Eu usei essa única linha de código para remover o meu problema "bitmap muito grande ...." :
fonte
A adição dos 2 atributos a seguir em (
AndroidManifest.xml
) funcionou para mim:fonte
Alterar o arquivo de imagem para
drawable-nodpi
pasta dadrawable
pasta funcionou para mim.fonte
drawable
pasta.Eu usei Picasso e tive o mesmo problema. a imagem era muito grande, pelo menos no tamanho, largura ou altura. finalmente encontrei a solução aqui. você pode reduzir a imagem grande de acordo com o tamanho da tela e também manter a proporção:
e use este método para carregar a imagem do Picasso:
também para um melhor desempenho, você pode fazer o download da imagem de acordo com a largura e a altura da tela, e não toda a imagem:
e depois:
EDIT: getDisplaySize ()
display.getWidth()/getHeight()
está obsoleto. Em vez deDisplay
usarDisplayMetrics
.fonte
BitmapRegionDecoder
faz o truque.Você pode substituir
onDraw(Canvas canvas)
, iniciar um novo Thread e decodificar a área visível para o usuário.fonte
Conforme apontado por Larcho, a partir do nível 10 da API, você pode
BitmapRegionDecoder
carregar regiões específicas de uma imagem e, com isso, pode mostrar uma imagem grande em alta resolução alocando na memória apenas as regiões necessárias. Recentemente, desenvolvi uma biblioteca que fornece a visualização de imagens grandes com manipulação de gestos por toque. O código fonte e as amostras estão disponíveis aqui .fonte
Ver nível
Você pode desativar a aceleração de hardware para uma visualização individual em tempo de execução com o seguinte código:
myView.setLayerType (View.LAYER_TYPE_SOFTWARE, nulo);
fonte
Corri pelo mesmo problema, aqui está a minha solução. defina a largura da imagem igual à largura da tela do Android e depois dimensione a altura
Isto é melhor para qualquer tamanho de tela Android. deixe-me saber se funciona para você.
fonte
Reduzir imagem:
A imagem será reduzida no tamanho de reqHeight e reqWidth. Pelo que entendi, inSampleSize apenas absorve uma potência de 2 valores.
fonte
Use a biblioteca Glide em vez de carregar diretamente na visualização de imagem
Deslize: https://github.com/bumptech/glide
fonte
Tentei todas as soluções acima, uma após a outra, por muitas horas, e nenhuma parecia funcionar! Finalmente, decidi procurar um exemplo oficial sobre a captura de imagens com a câmera do Android e exibi-las. O exemplo oficial ( aqui ) finalmente me deu o único método que funcionou. Abaixo, apresento a solução que encontrei nesse aplicativo de exemplo:
fonte
NOTA PARA QUEM QUER COLOCAR IMAGENS DE TAMANHO PEQUENO:
A solução do Pilot_51 (mover suas imagens para a
drawable-nodpi
pasta) funciona, mas tem outro problema: torna as imagens MUITO PEQUENAS na tela, a menos que as imagens sejam redimensionadas para uma resolução muito grande (como 2000 x 3800) para caber na tela - e torna seu aplicativo mais pesado .SOLUÇÃO : coloque seus arquivos de imagem
drawable-hdpi
- funcionou como um encanto para mim.fonte
Usar a subpasta desenhável correta resolveu isso para mim. Minha solução foi colocar minha imagem em resolução máxima (1920x1200) na pasta drawable-xhdpi , em vez da pasta drawable .
Também coloquei uma imagem reduzida (1280x800) na pasta drawable-hdpi .
Essas duas resoluções correspondem aos tablets Nexus 7 de 2013 e 2012 que estou programando. Também testei a solução em alguns outros tablets.
fonte
Este código é trabalho
fonte