2011-06-18 11 views
5

Estoy tratando de descargar imags desde una url y luego decodificarlos. El problema es que no sé qué tan grande son y si los decodifico de inmediato, la aplicación se bloquea con imágenes demasiado grandes.¿Por qué recibo java.io.IOException: Mark ha sido invalidado?

Estoy haciendo lo siguiente y funciona con la mayoría de las imágenes pero con algunas de ellas arroja la excepción java.io.IOException: Mark has been invalidated. No es una cuestión de tamaño porque ocurre con una imagen de 75 KB o 120 KB y no con una imagen de 20 MB o 45 KB. También el formato no es importante ya que puede suceder con una imagen jpg o png.

pis es un InputStream.

Options opts = new BitmapFactory.Options(); 
    BufferedInputStream bis = new BufferedInputStream(pis); 
    bis.mark(1024 * 1024); 
    opts.inJustDecodeBounds = true; 
    Bitmap bmImg=BitmapFactory.decodeStream(bis,null,opts); 

    Log.e("optwidth",opts.outWidth+""); 
    try { 
     bis.reset(); 
     opts.inJustDecodeBounds = false; 
     int ratio = opts.outWidth/800; 
     Log.e("ratio",String.valueOf(ratio)); 
     if (opts.outWidth>=800)opts.inSampleSize = ratio; 

     return BitmapFactory.decodeStream(bis,null,opts); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return null; 
    } 

Respuesta

6

Creo que quieres decodificar la imagen grande. Lo hice seleccionando la imagen de la galería.

File photos= new File("imageFilePath that you select"); 
Bitmap b = decodeFile(photos); 

"decodeFile (photos)" se utiliza para descodificar una imagen grande. Creo que necesitas obtener imágenes .png o .jpg formet.

private Bitmap decodeFile(File f){ 
     try { 
      //decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

      //Find the correct scale value. It should be the power of 2. 
      final int REQUIRED_SIZE=70; 
      int width_tmp=o.outWidth, height_tmp=o.outHeight; 
      int scale=1; 
      while(true){ 
       if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
        break; 
       width_tmp/=2; 
       height_tmp/=2; 
       scale++; 
      } 

      //decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize=scale; 
      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
     } catch (FileNotFoundException e) {} 
     return null; 
    } 

puede visualizarlo utilizando imageView.

ImageView img = (ImageView)findViewById(R.id.sdcardimage); 
img.setImageBitmap(b); 
+0

Pero cómo puedo pasar el InputStream que contiene la información para ser convertida en un mapa de bits? ¿ – sergi

+0

@sergi esta es la mejor manera de hacerlo. Usted tiene un InputStream y 'decodeStream()' toma un parámetro de flujo de entrada. – Haphazard

+0

Ahora lo tengo trabajando de esta manera, pero quería ver cuál era la mejor manera de hacerlo ... – sergi

Cuestiones relacionadas