Evitar que el mapa de bits sea demasiado grande para ser cargado en una textura Android -- android campo con android-bitmap camp Relacionados El problema

Prevent bitmap too large to be uploaded into a texture android


15
vote

problema

Español

Necesito mostrar una imagen original en pantalla completa en forma de galería. Para el pulgar, funcionará perfectamente y cuando intento mostrar esa imagen en pantalla completa con fuente original, no podrá mostrar. En la mayoría de los casos, si la resolución de la imagen es mayor, entonces 2000, luego mostrará un error mapa de bits demasiado grande que se cargará en una textura Android .

Quiero evitar esto, busco a Google pero no recibe ninguna respuesta con respecto a esto.

Original en ingles

I need to display original image in full screen in gallery form. For thumb it will be work perfectly and when I try to display that image in full screen with original source it will not be able to display. In most cases if the image resolution is greater then 2000 then it will display error bitmap too large to be uploaded into a texture android.

I want to prevent this, I have search google but not getting any answer regarding this.

     

Lista de respuestas

17
 
vote

Me encontré con el mismo problema y se me ocurrió una solución de un forro para este problema aquí :

  Picasso.with(context).load(new File(path/to/File)).fit().centerCrop().into(imageView);   
 

I came across the same problem and came up with a one liner solution for this problem here:

Picasso.with(context).load(new File(path/to/File)).fit().centerCrop().into(imageView); 
 
 
     
     
8
 
vote

Acabo de crear una función si la función es que la imagen es más grande que 1M Píxeles Aquí está el código de muestra:

  public void onActivityResult(int requestCode, int resultCode, Intent data) {     if (resultCode == RESULT_OK) {       if (requestCode == SELECT_PICTURE) {          Uri selectedImageUri = data.getData();         selectedImagePath = getPath(selectedImageUri);         BitmapFactory.Options options = new BitmapFactory.Options();         options.inSampleSize = 4;          Bitmap bitmap = BitmapFactory.decodeFile(selectedImagePath);         int height = bitmap.getHeight(), width = bitmap.getWidth();          if (height > 1280 && width > 960){             Bitmap imgbitmap = BitmapFactory.decodeFile(selectedImagePath, options);             imageView.setImageBitmap(imgbitmap);              System.out.println("Need to resize");          }else {             imageView.setImageBitmap(bitmap);             System.out.println("WORKS");         }   
 

i just created a if else function to check if the image is bigger than 1M pixels here's the sample code:

public void onActivityResult(int requestCode, int resultCode, Intent data) {     if (resultCode == RESULT_OK) {       if (requestCode == SELECT_PICTURE) {          Uri selectedImageUri = data.getData();         selectedImagePath = getPath(selectedImageUri);         BitmapFactory.Options options = new BitmapFactory.Options();         options.inSampleSize = 4;          Bitmap bitmap = BitmapFactory.decodeFile(selectedImagePath);         int height = bitmap.getHeight(), width = bitmap.getWidth();          if (height > 1280 && width > 960){             Bitmap imgbitmap = BitmapFactory.decodeFile(selectedImagePath, options);             imageView.setImageBitmap(imgbitmap);              System.out.println("Need to resize");          }else {             imageView.setImageBitmap(bitmap);             System.out.println("WORKS");         } 
 
 
4
 
vote

Google proporcionó una capacitación sobre cómo hacerlo. Descarga la muestra de Visualización de mapas de bits de manera eficiente

Eche un vistazo a la clase Imageresizer. Imageresizer.decodesampledbitmapde * Use este método para obtener la imagen de escala reducida.

 

Google provided a training how to do that. Download the sample from Displaying Bitmaps Efficiently

Take a look to ImageResizer class. ImageResizer.decodeSampledBitmapFrom* use this method to get downscaled image.

 
 
         
         
3
 
vote

Este es el código que utilizo para rectificar mi problema de ajustar una imagen de resolución de tamaño 3120x4196 en una vista de imagen de la resolución 4096x4096. Aquí ImageViewID es el ID de la vista de imagen creada en la distribución principal y la inocialización de ImageFilelocalización es la ruta de la imagen que se debe cambiar de tamaño.

          ImageView imageView=(ImageView)findViewById(R.id.ImageViewId);                   Bitmap d=BitmapFactory.decodeFile(ImageFileLcation);         int newHeight = (int) ( d.getHeight() * (512.0 / d.getWidth()) );         Bitmap putImage = Bitmap.createScaledBitmap(d, 512, newHeight, true);         imageView.setImageBitmap(putImage);   
 

This is the code I used to rectify my problem of fitting an image of size 3120x4196 resolution in an image view of 4096x4096 resolution. Here ImageViewId is the id of the image view created in the main layout and ImageFileLocation is the path of the image which is to be resized.

        ImageView imageView=(ImageView)findViewById(R.id.ImageViewId);                   Bitmap d=BitmapFactory.decodeFile(ImageFileLcation);         int newHeight = (int) ( d.getHeight() * (512.0 / d.getWidth()) );         Bitmap putImage = Bitmap.createScaledBitmap(d, 512, newHeight, true);         imageView.setImageBitmap(putImage); 
 
 
1
 
vote

No necesita cargar toda la imagen, porque es demasiado grande y, probablemente, su teléfono no pueda mostrar los píxeles de mapa de bits completos. Debe escalarlo primero de acuerdo con el tamaño de la pantalla de su dispositivo. Este es el mejor método que encontré y funciona bastante bien: Android: Cambiar el tamaño de un archivo de mapa de bits grande al archivo de salida escalado < / a>

 

You don't need to load the whole image, cause it's too large and probably your phone won't able to show the full bitmap pixels. You need to scale it first according to your device screen size. This is the best method that I found and it works pretty good: Android: Resize a large bitmap file to scaled output file

 
 
1
 
vote

Encontré una manera de hacer esto sin usar ninguna biblioteca externa :

  if (bitmap.getHeight() > GL10.GL_MAX_TEXTURE_SIZE) {      // this is the case when the bitmap fails to load     float aspect_ratio = ((float)bitmap.getHeight())/((float)bitmap.getWidth());     Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0,                     (int) ((GL10.GL_MAX_TEXTURE_SIZE*0.9)*aspect_ratio),                     (int) (GL10.GL_MAX_TEXTURE_SIZE*0.9));     imageView.setImageBitmap(scaledBitmap); } else{      // for bitmaps with dimensions that lie within the limits, load the image normally     if (Build.VERSION.SDK_INT >= 16) {         BitmapDrawable ob = new BitmapDrawable(getResources(), bitmap);         imageView.setBackground(ob);     } else {         imageView.setImageBitmap(bitmap);     } }   

Básicamente, las dimensiones máximas de la imagen son un límite impuesto por el sistema. El enfoque anterior cambiará correctamente los mapas de bits que excedan este límite. Sin embargo, solo se cargará una parte de toda la imagen. Para cambiar la región que se muestra, puede alterar el x y y Parámetros del método .

Este enfoque maneja los mapas de bits de cualquier tamaño, incluidas las imágenes tomadas con cámaras profesionales.

Referencias:

Android universal universal cargador .

 

I found a way to do this without using any external libraries:

if (bitmap.getHeight() > GL10.GL_MAX_TEXTURE_SIZE) {      // this is the case when the bitmap fails to load     float aspect_ratio = ((float)bitmap.getHeight())/((float)bitmap.getWidth());     Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0,                     (int) ((GL10.GL_MAX_TEXTURE_SIZE*0.9)*aspect_ratio),                     (int) (GL10.GL_MAX_TEXTURE_SIZE*0.9));     imageView.setImageBitmap(scaledBitmap); } else{      // for bitmaps with dimensions that lie within the limits, load the image normally     if (Build.VERSION.SDK_INT >= 16) {         BitmapDrawable ob = new BitmapDrawable(getResources(), bitmap);         imageView.setBackground(ob);     } else {         imageView.setImageBitmap(bitmap);     } } 

Basically, the maximum image dimensions are a system-imposed limit. The above approach will correctly resize bitmaps that exceed this limit. However, only a portion of the entire image will be loaded. To change the region displayed, you can alter the x and y parameters of the createBitmap() method.

This approach handles bitmaps of any size, including pictures taken with professional cameras.

References:

Android Universal Image Loader.

 
 
 
 

Relacionados problema

0  No hay mejoras de rendimiento mediante el uso de asintsrask dentro de InstantiateItem (PagerAdapter)  ( No performance improvement by using asynctask inside instantiateitem pageradapt ) 
Estoy usando un ViewPager para mostrar la pantalla completa de MI imágenes. Básicamente, hace clic en la imagen en miniatura de la imagen y se inicia una nu...

1  Excepción de Memoria para Mapas de bits grande  ( Outofmemory exception for large bitmap ) 
Encontré mucha documentación sobre cómo cargar grandes mapas de bits y evitar la excepción de Memoria. Pero el problema es que tengo que tomar la imagen de My...

0  ¿Hay una manera de crear una ruta de carrera fija mientras se acerca a Android?  ( There is a way to create a fixed stroke path while zooming in android ) 
Estoy tratando de dibujar un Path en un SurfaceView a través de un Bitmap6 @Override public void draw(Canvas canvas) { super.draw(canvas); mCan...

-2  Android fuera de la excepción de la memoria  ( Android out of memory exception ) 
Ayuda para resolverme esta excepción fuera de la memoria, ya que no puedo resolverlo, cualquier ayuda sería muy apreciada, 06-04 12:11:44.119: E/AndroidRun...

0  Cambiar el tamaño del mapa de bits solo si es demasiado grande  ( Resize bitmap only if too large ) 
Me gustaría cambiar el tamaño de cada foto tomada con la cámara solo si la foto es demasiado grande (por ejemplo, solo de ancho y gt; 2048px). He visto en e...

0  Cómo obtener un poco de profundidad de un mapa de bits en Mono para Android  ( How to get bit depth of a bitmap on mono for android ) 
En .NET Una forma de verificar el bitdepth de una imagen de mapa de bits está usando la clase de mapa de bits, así: switch (bitmap.PixelFormat) { ...

0  Convertir un vector de 24px, 36px dibujable a mapa de bits devuelve el mismo icono de tamaño  ( Converting a 24px 36px vector drawable to bitmap returns same sized icon ) 
ic_business_white_36px, ic_business_white_24px, al convertir estos dibujables vectoriales en mapa de bits, se ven del mismo tamaño, como un icono de 24DP, ¿có...

0  Definiendo el tamaño del mapa de bits en la aplicación de Android  ( Defining the size of the bitmap in android app ) 
Mi juego de Android tiene sprites que rebotan por todo el lugar, pero en los bordes / paredes derecha e inferior de la pantalla, los sprites se apagan ligeram...

0  ¿Cómo convertir la cadena binaria en mapa de bits?  ( How to convert binary string to bitmap ) 
Soy nuevo en Android. Estoy obteniendo un problema, ya que pasa mi imagen como binario en API que usa la reequipación, pero mientras recibe la misma cadena bi...

0  Mostrar la imagen capturada de la cámara en pantalla completa, sin perder relación de aspecto - Android  ( Display camera captured image to fullscreen without losing aspect ratio andro ) 
En mi aplicación de Android, estoy capturando la imagen con la cámara personalizada. Soy capaz de configurar la vista previa de la cámara con la resolución ad...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos