2010-05-07 3 views
7

Je suis en train d'ouvrir un flux à distance d'une image JPEG et le convertir en un objet Bitmap:Skia décodeur ne parvient pas à décoder à distance flux

BitmapFactory.decodeStream(
new URL("http://some.url.to/source/image.jpg") 
.openStream()); 

Le décodeur renvoie NULL et dans les journaux que je reçois le message suivant :

DEBUG/skia(xxxx): --- decoder->decode returned false 

note:
1. la longueur du contenu est de type non nul et le contenu est image/jpeg
2. Quand j'ouvre l'URL dans le navigateur, je peux voir l'image.

Qu'est-ce qui me manque ici?

Aidez-nous s'il vous plaît. Merci.

+0

Pouvez-vous fournir un lien vers une image qui présente ce comportement? – CommonsWare

+0

Malheureusement, je ne peux pas. Je comprends ce que vous indiquez indirectement ici ... :) – Samuh

Répondre

3

semble qu'il y avait un problème avec le flux et la façon dont android géré; le correctif dans ce bug report a résolu le problème pour l'instant.

10

La solution fournie dans android bug n°6066 consiste à remplacer le fichier std FilterInputStream et à l'envoyer à 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; 
    } 
} 

puis utilisez la fonction decodeStream:

Bitmap bitmap = BitmapFactory.decodeStream(new FlushedInputStream(inputStream)); 

L'autre solution que j'ai trouvé est de donner simplement une BufferedInputStream à th BitmapFactory:

Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream)); 

Ces deux les solutions devraient faire l'affaire.

Plus d'informations peuvent être trouvées dans les commentaires du rapport de bogue: android bug no.6066

+2

FWIW la méthode FlushedInputStream a fonctionné pour moi; le BufferedInputStream n'a pas. De plus, "byte" est un mot-clé réservé, donc vous devriez changer "int byte" en "int byteValue" ou quelque chose comme ça. – esilver

+0

Cette solution fonctionne pour moi et je pense que cela devrait être la bonne réponse. – KaHeL

+1

Ce bug n'est toujours pas corrigé et les solutions de contournement ne fonctionnent pas toujours. – slybloty

0

Pour moi, le problème est avec le type de couleur de l'image: l'image est en couleur = CMYK pas RVB

0

J'ai trouvé un bibliothèque, qui peut ouvrir des images sur lesquelles Android SKIA échoue. Il peut être utile pour certains usecases:

https://github.com/suckgamony/RapidDecoder

Pour moi, il a résolu le problème que je ne se charge pas beaucoup d'images à la fois et beaucoup d'images que je charge ont le profil ICC. Je n'ai pas essayé de l'intégrer avec certaines librairies communes comme Picasso ou Glide.

Questions connexes