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

I do not understand why I get this IO exception. He says in the docs, "Throws IOException if the image format is not supported or can not be decoded." and "he stream position will be where ever it was after the encoded data was read. Currently only the JPEG and PNG formats are supported." , and I give it PNG, I even bitmapOptions.outMimeType; image type with bitmapOptions.outMimeType; and he 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; } 
+4
source share
1 answer

An exception is not thrown due to the wrong file type, but because it is not readable.

 BitmapFactory.decodeStream(inputStream, null, bitmapOptions); 

This "crosses" the stream, and your stream object no longer starts from the beginning.

The solution is to call inputStream = connection.getInputStream(); again inputStream = connection.getInputStream(); after that, to return the stream to it as source text.

+1
source

Source: https://habr.com/ru/post/1485918/


All Articles