J'ai des problèmes avec BitmapFactory.decodeStream(inputStream)
. Lorsque vous l'utilisez sans options, il renverra une image. Mais quand je l'utilise avec des options car .decodeStream(inputStream, null, options)
il ne renvoie jamais de Bitmaps.
Ce que j'essaie de faire, c'est de sous-échantillonner un Bitmap avant de le charger pour économiser de la mémoire. J'ai lu quelques bons guides, mais aucun n'utilise .decodeStream
.
Fonctionne très bien
URL url = new URL(sUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
Bitmap img = BitmapFactory.decodeStream(is, null, options);
NE FONCTIONNE PAS
InputStream is = connection.getInputStream();
Bitmap img = BitmapFactory.decodeStream(is, null, options);
InputStream is = connection.getInputStream();
Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, options);
Boolean scaleByHeight = Math.abs(options.outHeight - TARGET_HEIGHT) >= Math.abs(options.outWidth - TARGET_WIDTH);
if (options.outHeight * options.outWidth * 2 >= 200*100*2){
// Load, scaling to smallest power of 2 that'll get it <= desired dimensions
double sampleSize = scaleByHeight
? options.outHeight / TARGET_HEIGHT
: options.outWidth / TARGET_WIDTH;
options.inSampleSize =
(int)Math.pow(2d, Math.floor(
Math.log(sampleSize)/Math.log(2d)));
}
// Do the actual decoding
options.inJustDecodeBounds = false;
Bitmap img = BitmapFactory.decodeStream(is, null, options);
Réponses:
Le problème était qu'une fois que vous avez utilisé un InputStream à partir d'un HttpUrlConnection pour récupérer les métadonnées d'image, vous ne pouvez plus rembobiner et utiliser à nouveau le même InputStream.
Par conséquent, vous devez créer un nouveau InputStream pour l'échantillonnage réel de l'image.
la source
Essayez d'envelopper InputStream avec BufferedInputStream.
la source
Je pense que le problème vient de la logique "calculer-facteur d'échelle" parce que le reste du code me semble correct (en supposant bien sûr que le flux d'entrée n'est pas nul).
Ce serait mieux si vous pouvez factoriser toute la logique de calcul de taille de cette routine dans une méthode (appelez-la CalculateScaleFactor () ou autre) et tester cette méthode indépendamment d'abord.
Quelque chose comme:
et testez getScaleFactor (...) indépendamment.
Cela aidera également à entourer tout le code du bloc try..catch {}, si ce n'est déjà fait.
la source
Vous pouvez convertir InputStream en un tableau d'octets et utiliser decodeByteArray (). Par exemple,
la source