Skiaデコーダーはリモートストリームをデコードできません
質問
JPEG画像のリモートストリームを開き、BitMapオブジェクトに変換しようとしています。
BitmapFactory.decodeStream(
new URL("http://some.url.to/source/image.jpg")
.openStream());
デコーダーはnullを返し、ログで次のメッセージが表示されます。
DEBUG/skia(xxxx): --- decoder->decode returned false
ノート:
1.コンテンツの長さはゼロ以外で、コンテンツタイプは image/jpeg
2.ブラウザでURLを開くと、画像が表示されます。
私がここに欠けていることは何ですか?
助けてください。ありがとう。
解決 2
ストリームとAndroidがそれを処理した方法にいくつかの問題があったようです。これのパッチ バグレポート 今のところ問題を解決しました。
他のヒント
で提供されるソリューション AndroidバグN°6066 STD FilterInputStreamをオーバーライドしてから、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;
}
}
次に、デコデストリーム関数を使用します。
Bitmap bitmap = BitmapFactory.decodeStream(new FlushedInputStream(inputStream));
私が見つけたもう1つの解決策は、BufferedInputStreamをBitMapFactoryに単純に与えることです。
Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
これらの2つのソリューションはトリックを行う必要があります。
詳細については、バグレポートのコメントをご覧ください。 AndroidバグNo.6066
私にとって問題は画像の色のタイプです:あなたのイメージは色= rgbではないcymkです
Android Skiaが失敗する画像を開くことができるライブラリを見つけました。特定のユーザーケースには役立ちます。
https://github.com/suckgamony/rapiddecoder
私にとっては、私が一度に多くの画像をロードしておらず、私がロードする多くの画像にICCプロファイルを持っているので、それは問題を解決しました。 PicassoやGlideなどの一般的なライブラリと統合してみませんでした。