Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Odd BitmapRegionDecoder java.io.IOException: Image format not supported w/ png and jpeg images

Tags:

bitmap

I do not understand why I am getting this IO Exception. It says in the docs "Throws IOException if the image format is not supported or can not be decoded." and "he stream's position will be where ever it was after the encoded data was read. Currently only the JPEG and PNG formats are supported." and I am giving it a PNG, I even output the image type by using bitmapOptions.outMimeType; and it says image/png

Code :

    @Override
protected List<String> doInBackground(String... urlo) {
    List<String> savedKeys = new ArrayList<String>();
    InputStream inputStream = null;
    try {
        URL url = new URL("https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png");
           HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
           inputStream = connection.getInputStream();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   



    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
    bitmapOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(inputStream, null, bitmapOptions);
    int width = bitmapOptions.outWidth;
    int height = bitmapOptions.outHeight;
    String imageType = bitmapOptions.outMimeType;
    Debug.out(imageType);



    int block = 256;
    int count =0;
    BitmapRegionDecoder decoder = null;
    try {
        decoder = BitmapRegionDecoder.
            newInstance(inputStream, false);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Rect tileBounds = new Rect();
    // loop blocks
    for (int i=0; i<height; i+=block) {
        // get vertical bounds limited by image height
        tileBounds.top = i;
        int h = i+block<height ? block : height-i;
        tileBounds.bottom = i+h;
        tileBounds.right = 0;
        tileBounds.left = width;
        Debug.out(tileBounds.left+" "+tileBounds.right+" "+tileBounds.top+tileBounds.bottom);
            // load tile
        tile = decoder.decodeRegion(tileBounds, bitmapOptions);
        MainActivity.cache.put(key+count, tile);
          publishProgress();
          tile.recycle();
        savedKeys.add(key+count);

    }
    try {
        inputStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return savedKeys;

}
like image 422
Osman Avatar asked Nov 03 '22 20:11

Osman


1 Answers

The exeption is not thrown because of the wrong filetype, but because it was not readable.

BitmapFactory.decodeStream(inputStream, null, bitmapOptions); 

This "traverses" the stream, and your stream object no longer start at the beginning.

The solution is to call inputStream = connection.getInputStream(); again after this, to return the stream to it's orignal readable state.

like image 104
Anders Strand Avatar answered Jan 04 '23 13:01

Anders Strand