2011-06-18 23 views
5

Tôi đang cố gắng tải xuống imags từ url và sau đó giải mã chúng. Vấn đề là tôi không biết chúng lớn bao nhiêu và nếu tôi giải mã chúng ngay lập tức, ứng dụng sẽ gặp sự cố với hình ảnh quá lớn.Tại sao tôi nhận được java.io.IOException: Đánh dấu đã bị vô hiệu?

Tôi đang làm như sau và nó hoạt động với hầu hết các hình ảnh nhưng với một số trong số đó, nó ném ngoại lệ java.io.IOException: Mark has been invalidated. Nó không phải là vấn đề về kích thước vì nó xảy ra với hình ảnh 75KB hoặc 120KB và không có hình ảnh 20MB hoặc 45KB. Ngoài ra định dạng cũng không quan trọng vì nó có thể xảy ra với hình ảnh jpg hoặc png.

pisInputStream.

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; 
    } 

Trả lời

6

Tôi nghĩ bạn muốn giải mã hình ảnh lớn. Tôi đã làm nó bằng cách chọn hình ảnh bộ sưu tập.

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

"decodeFile (ảnh)" được sử dụng để giải mã ảnh lớn. Tôi nghĩ bạn cần tải hình ảnh .png hoặc .jpg.

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; 
    } 

bạn có thể hiển thị bằng cách sử dụng imageView.

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

Nhưng làm cách nào để chuyển InputStream chứa thông tin được chuyển đổi thành bitmap? ¿ – sergi

+0

@sergi đây là cách tốt nhất để thực hiện. Bạn có một InputStream và 'decodeStream()' lấy một tham số dòng đầu vào. – Haphazard

+0

Bây giờ tôi đã có nó làm việc theo cách này nhưng muốn xem đó là cách tốt nhất để làm điều đó .. – sergi