I'm trying to adopt bitmap resizing tutorial - the only difference is that I use decodeStream instead of decodeResource. It's strange but decodeStream, without any manipulations, gives me a bitmap obj, but when I go through decodeSampledBitmapFromStream it returns null for some reason. How do I fix it ?
Here's the code I use:
protected Handler _onPromoBlocksLoad = new Handler() {
@Override
public void dispatchMessage(Message msg) {
PromoBlocksContainer c = (PromoBlocksContainer) _promoBlocksFactory.getResponse();
HttpRequest request = new HttpRequest(c.getPromoBlocks().get(0).getSmallThumbnail());
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
InputStream stream;
ImageView v = (ImageView) findViewById(R.id.banner);
try {
stream = request.getStream();
//v.setImageBitmap(BitmapFactory.decodeStream(stream)); Works fine
Bitmap img = decodeSampledBitmapFromStream(stream, v.getWidth(), v.getHeight());
v.setImageBitmap(img);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
};
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromStream(InputStream res, int reqWidth, int reqHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(res, null, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
Bitmap img = BitmapFactory.decodeStream(res, null, options); // Gives null
return img;
}
There are some problems in the replies of the second floor. Because in the Method of
copy()
,inputstream
has been used,so in the method ofdecodeSampledBitmapFromInputStream(in,copyOfIn)
,we can not catch the value ofoptions.outWidth
.Here I did some correction;We can convert each other between
byte[]
andinputstream
So,we can convertinputstream
tobyte[]
, This can be used multiple times.Code as follows:
The problem was that once you've used an InputStream from a HttpUrlConnection, you can't rewind and use the same InputStream again. Therefore you have to create a new InputStream for the actual sampling of the image. Otherwise we have to abort the http request.
Because the InputStream Object can only be consumed once, you have to make a deep copy of an InputStream Object when you want to resize the bitmap from inputStream of HttpUrlConnection,otherwise decodeStream will returns null.Here is one possible solution:
the souce code of Method copy is as follows:
the souce code of Method decodeSampledBitmapFromInputStream is as follows: