3

ここで画像をテストします:http: //images.plurk.com/tn_4134189_bf54fe8e270ce41240d534b5133884ee.gif

インターネットで見つかったいくつかの解決策を試しましたが、実用的な解決策はありません。

次のスニペットコードを使用しています。

Url imageUrl = new Url("http://images.plurk.com/tn_4134189_bf54fe8e270ce41240d534b5133884ee.gif");
Bitmap image = BitmapFactory.decodeStream(imageUrl.openStream());

常にこのログを取得します:

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

何か助けはありますか?ありがとう。

編集:

デコードに失敗した画像もに表示できませんWebView。しかし、ブラウザで開いているかどうかを確認できます。

4

9 に答える 9

4

私は同じ問題を抱えていましたが、このクラスによって部分的に修正されました:

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 byte = read();
              if (byte < 0) {
                  break;  // we reached EOF
              } else {
                  bytesSkipped = 1; // we read one byte
              }
       }
        totalBytesSkipped += bytesSkipped;
    }
    return totalBytesSkipped;
}

}

と:

InputStream in = null;
    try {
        in = new java.net.URL(imageUrl).openStream();
        } catch (MalformedURLException e) {
        e.printStackTrace();
        } catch (IOException e) {
        e.printStackTrace();
        }
Bitmap image = BitmapFactory.decodeStream(new FlushedInputStream(in));

ほとんどの場合に役立ちましたが、これは普遍的な解決策ではありません。詳細については、このバグレポートを参照してください。

幸運!

于 2010-10-20T15:18:08.577 に答える
4

一時的な回避策としてこれを試してください:

最初に次のクラスを追加します。

  public static class PlurkInputStream extends FilterInputStream {

    protected PlurkInputStream(InputStream in) {
        super(in);
    }

    @Override
    public int read(byte[] buffer, int offset, int count)
        throws IOException {
        int ret = super.read(buffer, offset, count);
        for ( int i = 2; i < buffer.length; i++ ) {
            if ( buffer[i - 2] == 0x2c && buffer[i - 1] == 0x05
                && buffer[i] == 0 ) {
                buffer[i - 1] = 0;
            }
        }
        return ret;
    }

}

次に、元のストリームを PlurkInputStream でラップします。

Bitmap bitmap = BitmapFactory.decodeStream(new PlurkInputStream(originalInputStream));

これが役立つかどうか教えてください。

編集:

申し訳ありませんが、代わりに次のバージョンをお試しください。

        for ( int i = 6; i < buffer.length - 4; i++ ) {
            if ( buffer[i] == 0x2c ) {
                if ( buffer[i + 2] == 0 && buffer[i + 1] > 0
                    && buffer[i + 1] <= 48 ) {
                    buffer[i + 1] = 0;
                }
                if ( buffer[i + 4] == 0 && buffer[i + 3] > 0
                    && buffer[i + 3] <= 48 ) {
                    buffer[i + 3] = 0;
                }
            }
        }

これは効率的なコードではなく、完全な/正しい解決策でもないことに注意してください。ほとんどの場合に機能しますが、すべてではありません。

于 2010-10-28T06:08:26.837 に答える
1

すべての解決策を試しましたが、問題は解決しませんでした。いくつかのテストの後、インターネット接続が安定していないときに、skia デコーダーが失敗する問題が頻繁に発生しました。私にとっては、画像を強制的に再ダウンロードすることで問題が解決しました。

この問題は、画像のサイズが大きい場合にも発生します。

ループを使用すると、最大 2 回の再試行が必要になり、イメージは正しくダウンロードされます。

Bitmap bmp = null;
int retries = 0;
while(bmp == null){
    if (retries == 2){
        break;
    }
    bmp = GetBmpFromURL(String imageURL);
    Log.d(TAG,"Retry...");
    retries++;
}
于 2012-08-08T18:50:24.873 に答える
0

これは、AndroidのInputStreamクラスのバグが原因です。有効な回避策とバグの説明は、http://code.google.com/p/android/issues/detail ?id=6066にあります。

于 2010-10-21T21:25:41.703 に答える
0

メモリ上の理由から、次のようなBitmapFactoryオプションを実装する必要があります。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4; // might try 8 also

主なダウンロードビットマップ関数は次のようになります。

Bitmap downloadBitmap(String url) {

    final HttpClient client = AndroidHttpClient.newInstance("Android");
    final HttpGet getRequest = new HttpGet(url);

    try {
        HttpResponse response = client.execute(getRequest);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) {
            if(DEBUG)Log.w("ImageDownloader", "Error " + statusCode +
                    " while retrieving bitmap from " + url);
            return null;
        }

        final HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream inputStream = null;
            try {

                inputStream = entity.getContent();
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 4; // might try 8 also
                return BitmapFactory.decodeStream(new FlushedInputStream(inputStream),null,options);

            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                entity.consumeContent();
            }
        }
    } catch (IOException e) {
        getRequest.abort();
        if(DEBUG)Log.w(TAG, "I/O error while retrieving bitmap from " + url, e);
    } catch (IllegalStateException e) {
        getRequest.abort();
        if(DEBUG)Log.w(TAG, "Incorrect URL: " + url);
    } catch (Exception e) {
        getRequest.abort();
        if(DEBUG)Log.w(TAG, "Error while retrieving bitmap from " + url, e);
    } finally {
        if ((client instanceof AndroidHttpClient)) {
            ((AndroidHttpClient) client).close();
        }
    }
    return null;
}

そして多分あなたはこのようにAsyncTaskを実装しなければなりません:http: //android-developers.blogspot.com/2010/07/multithreading-for-performance.html

于 2012-05-15T17:40:53.310 に答える
0

これを試して:

HttpGet httpRequest = new HttpGet(url);
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(entity);
InputStream is = bufferedHttpEntity.getContent();
Drawable d = Drawable.createFromStream(is, "");
//or bitmap
//Bitmap b = BitmapFactory.decodeStream(is);
于 2011-01-21T11:18:24.627 に答える
0

これはうまくいくはずです:

URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
connection.disconnect();
input.close();

myBitmap には画像が含まれています。

于 2010-09-27T11:14:38.307 に答える
0

私にとって問題は画像の色の種類にあります: あなたの画像は RGB ではなく color=CYMK にあります

于 2013-12-10T12:43:32.490 に答える