Ich habe Probleme mit BitmapFactory.decodeStream(inputStream)
. Wenn Sie es ohne Optionen verwenden, wird ein Bild zurückgegeben. Aber wenn ich es mit Optionen wie in verwende .decodeStream(inputStream, null, options)
, werden niemals Bitmaps zurückgegeben.
Ich versuche, eine Bitmap herunterzusampeln, bevor ich sie tatsächlich lade, um Speicherplatz zu sparen. Ich habe einige gute Anleitungen gelesen, aber keine mit .decodeStream
.
WERKE NUR FEIN
URL url = new URL(sUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
Bitmap img = BitmapFactory.decodeStream(is, null, options);
FUNKTIONIERT NICHT
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);
Antworten:
Das Problem war, dass Sie, sobald Sie einen InputStream von einer HttpUrlConnection zum Abrufen von Bildmetadaten verwendet haben, nicht mehr zurückspulen und denselben InputStream erneut verwenden können.
Daher müssen Sie einen neuen InputStream für die eigentliche Abtastung des Bildes erstellen.
quelle
Versuchen Sie, InputStream mit BufferedInputStream zu verpacken.
quelle
Ich denke, das Problem liegt in der Logik "Skalierungsfaktor berechnen", da der Rest des Codes für mich korrekt aussieht (vorausgesetzt natürlich, dass der Eingabestream nicht null ist).
Es wäre besser, wenn Sie die gesamte Logik der Größenberechnung aus dieser Routine in eine Methode zerlegen könnten (nennen Sie berechneScaleFactor () oder was auch immer) und diese Methode zuerst unabhängig testen.
Etwas wie:
und testen Sie getScaleFactor (...) unabhängig voneinander.
Es ist auch hilfreich, den gesamten Code mit dem Block try..catch {} zu umgeben, falls dies noch nicht geschehen ist.
quelle
Sie können den InputStream in ein Byte-Array konvertieren und decodeByteArray () verwenden. Beispielsweise,
quelle