validar metodos from centercrop android imageview

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?



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''