Why am I getting java.io.IOException: Mark was invalidated?

I am trying to download imags from url and then decrypt them. The problem is that I don’t know how big they are, and if I decode them right away, the application will come out with too large images.

I do the following, and it works with most images, but with some of them it throws an exception java.io.IOException: Mark has been invalidated. This is not a matter of size, because it happens with 75 KB or 120 KB images, not 20 MB or 45 KB images. Also, the format is not important, as this can happen with either jpg or png image.

pisis 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;
    }
+5
source share
1

, . , .

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

decodeFile () . , .png .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;
    }

imageView.

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

All Articles