android - metodos - catch "RuntimeException: Canvas: tratando de dibujar demasiado grande..."
metodos de imageview (3)
Tengo una aplicación que dibuja una imagen desde el sistema de archivos a la pantalla así:
Bitmap image = BitmapFactory.decodeFile(file.getPath());
imageView.setImageBitmap(image);
Si la imagen es muy grande, veo este error:
java.lang.RuntimeException: Canvas: trying to draw too large(213828900bytes) bitmap.
at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)
at android.graphics.Canvas.drawBitmap(Canvas.java:1415)
...
La pila no alcanza mi código. ¿Cómo puedo detectar este error? ¿O hay una forma más apropiada de dibujar la imagen en el imageView
que puede evitar este error?
Debe verificar el tamaño de la imagen y cargar un tamaño más pequeño de la imagen para evitar excepciones. Lea este artículo: Carga de mapas de bits de manera eficiente
También puedes usar la Biblioteca Picasso
El mapa de bits es demasiado grande y el objeto de mapa de bits no puede manejarlo. Por lo tanto, ImageView debería tener el mismo problema. Solución: cambie el tamaño de la imagen en programas como paint.net, o establezca un tamaño fijo para el mapa de bits y escalelo.
Antes de ir más allá, tu stacktrace se vincula al dibujo del mapa de bits, sin crear el objeto:
en android.graphics.Canvas.drawBitmap (Canvas.java:1415)
Como tal, puedes hacer esto:
Bitmap image = BitmapFactory.decodeFile(file.getPath());//loading the large bitmap is fine.
int w = image.getWidth();//get width
int h = image.getHeight();//get height
int aspRat = w / h;//get aspect ratio
int W = [handle width management here...];//do whatever you want with width. Fixed, screen size, anything
int H = w * aspRat;//set the height based on width and aspect ratio
Bitmap b = Bitmap.createScaledBitmap(image, W, H, false);//scale the bitmap
imageView.setImageBitmap(b);//set the image view
image = null;//save memory on the bitmap called ''image''
O, como se menciona aquí , también puedes usar Picasso
NOTA
La imagen que intentó cargar cuando el stacktrace es de, es 213828900 bytes
, que es 213mb. Esta es probablemente una imagen con una resolución muy alta, ya que cuanto mayor sea su tamaño, mayor será el número de bytes.
Con imágenes tan grandes, el método con escalado puede no funcionar ya que sacrifica demasiada calidad. Con imágenes tan grandes, Picasso puede ser lo único que lo carga sin una gran pérdida de resolución.
Solucioné el error en el código de LunarWatcher.
Bitmap image = BitmapFactory.decodeFile(file.getPath());
float w = image.getWidth();//get width
float h = image.getHeight();//get height
int W = [handle width management here...];
int H = (int) ( (h*W)/w);
Bitmap b = Bitmap.createScaledBitmap(image, W, H, false);//scale the bitmap
imageView.setImageBitmap(b);//set the image view
image = null;//save memory on the bitmap called ''image''