2010-05-07 12 views
7

ich einen Remote-Stream eines JPEG-Bildes zu öffnen versuchen und es in ein Bitmap-Objekt konvertieren:Skia Decoder ausfallen Remote-Stream dekodieren

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

Der Decoder gibt null zurück, und in den Protokollen mir die folgende Meldung erhalten :

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

Hinweis:
1. die Inhaltslänge nicht Null ist und der Inhaltstyp ist image/jpeg
2. Wenn ich die URL in Browser öffne ich das Bild sehen kann.

Was fehlt mir hier?

Bitte helfen. Vielen Dank.

+0

Können Sie einen Link zu einem Bild bereitstellen, das dieses Verhalten aufweist? – CommonsWare

+0

Leider kann ich nicht. Ich verstehe, was Sie indirekt hier andeuten ... :) – Samuh

Antwort

3

scheint es gab ein Problem mit dem Stream und die Art, wie android es gehandhabt; Der Patch in diesem bug report löste das Problem für jetzt.

10

Die in android bug n°6066 bereitgestellte Lösung besteht darin, den std FilterInputStream zu überschreiben und dann an die BitmapFactory zu senden.

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; 
    } 
} 

und verwenden Sie dann die decodeStream Funktion:

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

Die andere Lösung, die ich gefunden habe, ist, einfach eine BufferedInputStream geben BitmapFactory th:

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

Diese beiden Lösungen sollten den Trick machen.

Weitere Informationen finden Sie in den Bug-Report Kommentare zu finden: android bug no.6066

+2

FWIW die FlushedInputStream-Methode arbeitete für mich; der BufferedInputStream nicht. Außerdem ist "Byte" ein reserviertes Schlüsselwort, daher sollten Sie "int byte" in "int byteValue" oder so ändern. – esilver

+0

Diese Lösung funktioniert für mich und ich denke, das sollte die richtige Antwort sein. – KaHeL

+1

Dieser Fehler ist immer noch nicht behoben und die Problemumgehungen funktionieren nicht immer. – slybloty

0

Für mich ist das Problem mit der Art der Farbe des Bildes ist: Ihr Bild in Farbe ist = CYMK nicht in RGB

0

ich gefunden habe Bibliothek, die Bilder öffnen kann, auf denen Android SKIA fehlschlägt. Es kann für bestimmte Anwendungsfälle nützlich sein:

https://github.com/suckgamony/RapidDecoder

Für mich ist es das Problem gelöst, da ich nicht viele Bilder geladen bin auf einmal und viele Bilder ich ICC Profil zu laden. Ich habe nicht versucht, es mit einigen gängigen Bibliotheken wie Picasso oder Glide zu integrieren.