Skia Decoder riesce a decodificare flusso remoto
Domanda
Sto cercando di aprire un flusso a distanza di un'immagine JPEG e convertirla in un oggetto bitmap:
BitmapFactory.decodeStream(
new URL("http://some.url.to/source/image.jpg")
.openStream());
I ritorni decoder NULL e nei registri ottengo il seguente messaggio:
DEBUG/skia(xxxx): --- decoder->decode returned false
Nota:
1. la lunghezza del contenuto è diverso da zero e tipo di contenuto è image/jpeg
2. Quando ho aperto l'URL nel navigatore posso vedere l'immagine.
Che cosa è che mi manca qui?
Si prega di aiuto. Grazie.
Soluzione 2
Sembra che ci fosse qualche problema con il flusso e il modo in cui ha gestito Android; la patch in questo bug report risolto il problema per ora.
Altri suggerimenti
La soluzione fornita in Android bug n ° 6066 consiste nel sovrascrivendo il FilterInputStream std e poi inviarlo al BitmapFactory.
static class FlushedInputStream extends FilterInputStream {
public FlushedInputStream(InputStream inputStream) {
super(inputStream);
}
@Override
public long skip(long n) throws IOException {
long totalBytesSkipped = 0L;
while (totalBytesSkipped < n) {
long bytesSkipped = in.skip(n - totalBytesSkipped);
if (bytesSkipped == 0L) {
int byteValue = read();
if (byteValue < 0) {
break; // we reached EOF
} else {
bytesSkipped = 1; // we read one byte
}
}
totalBytesSkipped += bytesSkipped;
}
return totalBytesSkipped;
}
}
e quindi utilizzare la funzione decodeStream:
Bitmap bitmap = BitmapFactory.decodeStream(new FlushedInputStream(inputStream));
L'altra soluzione che ho trovato è quello di dare semplicemente un BufferedInputStream a th BitmapFactory:
Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
Queste due soluzioni dovrebbero fare il trucco.
Maggiori informazioni possono essere trovate nei commenti bug report: Android bug No.6066
Per me il problema è con il tipo di colore di immagine: l'immagine è a colori = CYMK non in RGB
ho trovato una libreria, che può aprire le immagini su cui Android SKIA fallisce. Può essere utile per alcuni casi d'uso:
https://github.com/suckgamony/RapidDecoder
Per me è risolto il problema, come non sto caricando molte immagini contemporaneamente e molte immagini che ho caricare avere profilo ICC. Non ho provato integrandolo con alcune librerie comuni come Picasso o Glide.