Estoy cargando un mapa de bits en un ImageView y veo este error. Entiendo que este límite se refiere a un límite de tamaño para las texturas de hardware OpenGL (2048x2048). La imagen que necesito cargar es una imagen de zoom de aproximadamente 4,000 píxeles de alto.
He intentado desactivar la aceleración de hardware en el manifiesto, pero no me alegro.
<application
android:hardwareAccelerated="false"
....
>
¿Es posible cargar una imagen de más de 2048 píxeles en un ImageView?
inSampleSize
enfoque.Respuestas:
Todo el renderizado se basa en OpenGL, por lo que no puede superar este límite (
GL_MAX_TEXTURE_SIZE
depende del dispositivo, pero el mínimo es 2048x2048, por lo que cualquier imagen inferior a 2048x2048 se ajustará).Con imágenes tan grandes, si desea alejarse y en un dispositivo móvil, debe configurar un sistema similar a lo que ve en Google Maps, por ejemplo. Con la imagen dividida en varias piezas y varias definiciones.
O puede reducir la imagen antes de mostrarla (consulte la respuesta del usuario 1352407 sobre esta pregunta).
Y también, tenga cuidado con la carpeta en la que coloca la imagen, Android puede escalar automáticamente las imágenes. Eche un vistazo a la respuesta de Pilot_51 a continuación sobre esta pregunta.
fuente
Esta no es una respuesta directa a la pregunta (cargar imágenes> 2048), sino una posible solución para cualquiera que experimente el error.
En mi caso, la imagen era más pequeña que 2048 en ambas dimensiones (1280x727 para ser exactos) y el problema se experimentó específicamente en un Galaxy Nexus. La imagen estaba en la
drawable
carpeta y ninguna de las carpetas calificadas. Android asume que los elementos dibujables sin un calificador de densidad son mdpi y los escala hacia arriba o hacia abajo para otras densidades, en este caso aumentados 2 veces para xhdpi. Mover la imagen del culpable adrawable-nodpi
para evitar la escala solucionó el problema.fuente
drawable
esencialmente unadrawable-mdpi
carpeta oculta . Esto también explicaba por qué mis marcadores de mapas personalizados se veían horribles (estaban siendo escalados, luego reducidos).He reducido la imagen de esta manera:
fuente
ctx
significa esto ?En lugar de pasar horas y horas tratando de escribir / depurar todo este código de reducción de muestras manualmente, ¿por qué no usarlo
Picasso
? Fue hecho para tratar conbitmaps
todo tipo y / o tamaño.He usado esta única línea de código para eliminar mi problema "mapa de bits demasiado grande ..." :
fuente
La adición de los siguientes 2 atributos en (
AndroidManifest.xml
) funcionó para mí:fuente
Cambiar el archivo de imagen a
drawable-nodpi
carpeta dedrawable
carpeta funcionó para mí.fuente
drawable
carpeta.Usé Picasso y tuve el mismo problema. la imagen era demasiado grande al menos en tamaño, ancho o alto. Finalmente encontré la solución aquí. puede reducir la imagen grande de acuerdo con el tamaño de la pantalla y también mantener la relación de aspecto:
y use este método para cargar imágenes de Picasso:
También para un mejor rendimiento, puede descargar la imagen de acuerdo con el ancho y la altura de la pantalla, no toda la imagen:
y entonces:
EDITAR: getDisplaySize ()
display.getWidth()/getHeight()
es obsoleto. En lugar deDisplay
usarDisplayMetrics
.fuente
BitmapRegionDecoder
Hace el truco.Puede anular
onDraw(Canvas canvas)
, iniciar un nuevo hilo y decodificar el área visible para el usuario.fuente
Como señaló Larcho, a partir del nivel API 10, puede usar
BitmapRegionDecoder
para cargar regiones específicas de una imagen y con eso, puede lograr mostrar una imagen grande en alta resolución asignando en la memoria solo las regiones necesarias. Recientemente desarrollé una biblioteca que proporciona la visualización de imágenes grandes con manejo de gestos táctiles. El código fuente y las muestras están disponibles aquí .fuente
Ver nivel
Puede deshabilitar la aceleración de hardware para una vista individual en tiempo de ejecución con el siguiente código:
myView.setLayerType (View.LAYER_TYPE_SOFTWARE, nulo);
fuente
Me encontré con el mismo problema, aquí está mi solución. establece el ancho de la imagen igual que el ancho de la pantalla de Android y luego escala la altura
Esto es mejor para cualquier tamaño de pantalla de Android. Avísame si te funciona.
fuente
Reducir imagen:
La imagen se reducirá al tamaño de reqHeight y reqWidth. Según tengo entendido, inSampleSize solo tiene una potencia de 2 valores.
fuente
Use la biblioteca Glide en lugar de cargar directamente en la vista de imagen
Glide: https://github.com/bumptech/glide
fuente
Probé todas las soluciones anteriores, una tras otra, durante muchas horas, ¡y ninguna parecía funcionar! Finalmente, decidí buscar un ejemplo oficial sobre capturar imágenes con la cámara de Android y mostrarlas. El ejemplo oficial ( aquí ), finalmente me dio el único método que funcionó. A continuación presento la solución que encontré en esa aplicación de ejemplo:
fuente
NOTA PARA AQUELLOS QUE QUIEREN PONER IMÁGENES DE TAMAÑO PEQUEÑO:
La solución de Pilot_51 (mover sus imágenes a la
drawable-nodpi
carpeta) funciona, pero tiene otro problema: hace que las imágenes sean MUY PEQUEÑAS en la pantalla a menos que las imágenes cambien de tamaño a una resolución muy grande (como 2000 x 3800) para ajustarse a la pantalla, entonces hace que su aplicación sea más pesada .SOLUCIÓN : coloque sus archivos de imagen
drawable-hdpi
: funcionó como un encanto para mí.fuente
Usar la subcarpeta dibujable correcta lo resolvió para mí. Mi solución fue poner mi imagen de resolución completa (1920x1200) en el dibujable-xhdpi carpeta, en lugar de la dibujable carpeta.
También puse una imagen reducida (1280x800) en la carpeta drawable-hdpi .
Estas dos resoluciones coinciden con las tabletas Nexus 7 de 2013 y 2012 que estoy programando. También probé la solución en algunas otras tabletas.
fuente
Este código es trabajo
fuente