3

jpeg を 2 段階でデコードしています。

  1. 境界を確認し、必要に応じてスケールを決定します。
  2. 画面制限内でデコードします。

public static Bitmap decodeSampledBitmapFromInputStream(InputStream data, int reqWidth, int reqHeight)
{
    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(data, null, options);

    // Calculate inSampleSize
    options.inSampleSize = Util.getExactSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;

    try {
        // TODO: This works, but is there a better way?
        if (data instanceof FileInputStream)
            ((FileInputStream)data).getChannel().position(0);
        else
            data.reset();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }

    return BitmapFactory.decodeStream(data, null, options);
}

基になるストリームが FileInputStream の場合、次のようにクラッシュしreset()ます。

java.io.IOException: マークが無効化されました。

そこで、sinstanceofの位置を手動でリセットするセクションを追加しましたFileInputStreamが、これはかなり厄介な解決策のように思えます。BufferedInputStreamカプセル化された a を適切にリセットする方法はありませんFileInputStreamか?

4

1 に答える 1

3

InputStream.reset を使用する前に、最初に InputStream.mark を呼び出して、後で戻りたい位置をマークする必要があります。

于 2013-09-21T05:47:47.503 に答える