Estou tendo problemas com BitmapFactory.decodeStream(inputStream)
. Ao usá-lo sem opções, ele retornará uma imagem. Mas quando eu uso com opções como .decodeStream(inputStream, null, options)
nunca retorna Bitmaps.
O que estou tentando fazer é reduzir a resolução de um bitmap antes de realmente carregá-lo para economizar memória. Eu li alguns bons guias, mas nenhum usando .decodeStream
.
FUNCIONA MUITO BEM
URL url = new URL(sUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
Bitmap img = BitmapFactory.decodeStream(is, null, options);
NÃO FUNCIONA
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);
Respostas:
O problema era que, uma vez que você usou um InputStream de um HttpUrlConnection para buscar metadados de imagem, você não pode retroceder e usar o mesmo InputStream novamente.
Portanto, você deve criar um novo InputStream para a amostragem real da imagem.
fonte
Tente agrupar InputStream com BufferedInputStream.
fonte
Acho que o problema é com a lógica "calcular fator de escala" porque o resto do código parece correto para mim (assumindo, é claro, que o fluxo de entrada não seja nulo).
Seria melhor se você pudesse fatorar toda a lógica de cálculo de tamanho dessa rotina em um método (chame-o calculeScaleFactor () ou qualquer outro) e teste esse método independentemente primeiro.
Algo como:
e teste getScaleFactor (...) independentemente.
Também ajudará a envolver todo o código com o bloco try..catch {}, se ainda não tiver sido feito.
fonte
Você pode converter o InputStream em uma matriz de bytes e usar o decodeByteArray (). Por exemplo,
fonte