0

私が達成したかったのは、実際にBitmapFactory.Optionsを変更せずに、入力ストリームからビットマップの高さと幅を計算できるようにすることです。

これは私がしたことです:

private Boolean testSize(InputStream inputStream){
    BitmapFactory.Options Bitmp_Options = new BitmapFactory.Options();
    Bitmp_Options.inJustDecodeBounds = true;
    BitmapFactory.decodeResourceStream(getResources(), new TypedValue(), inputStream, new Rect(), Bitmp_Options);
    int currentImageHeight = Bitmp_Options.outHeight;
    int currentImageWidth = Bitmp_Options.outWidth;
    if(currentImageHeight > 200 || currentImageWidth > 200){
        Object obj = map.remove(pageCounter);
        Log.i("Page recycled", obj.toString());
        return true;
    }
    return false;
}

ここでの主な問題は、BitmapFactory.Optionsが正しくdecodeStreamできない状態に変更されることです。

私の質問は、BitmapFactory.Optionsをリセットする別の方法がありますか?または別の可能な解決策?

別のメソッド:(topメソッドが適用されるとoriginalBitmapがnullになることに注意してください)

これは私の元のコードでした:

Bitmap originalBitmap = BitmapFactory.decodeStream(InpStream);

DeevとNobuGameの提案を適用する:(変更なし)

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = false;
    Bitmap originalBitmap = BitmapFactory.decodeStream(InpStream,null,options);
4

3 に答える 3

5

同じストリームから 2 回読み取ろうとしています。ストリームはバイト配列としては機能しません。そこからデータを読み取ると、ストリームの位置をリセットしない限り、再度読み取ることはできません。最初に decodeStream() を呼び出した後に InputStream.reset() を呼び出すことはできますが、すべての InputStream がこのメソッドをサポートしているわけではありません。

于 2012-06-27T00:10:13.390 に答える
0

Options オブジェクトを再利用しようとしている場合 (ちなみに、コード サンプルではそうではありません)、どのように再利用しようとしていますか? エラーメッセージは何ですか、何が問題なのですか? Bitmap を実際にデコードするために Options オブジェクトを再利用しようとしていますか? 次に、inJustDecodeBounds を false に設定します。

于 2012-06-25T19:21:20.663 に答える
0

inputStream.Mark と inputStream.Reset が機能しない場合に InputStream をコピーする単純なクラス。

呼び出すには:

CopyInputStream copyStream = new CopyInputStream(zip);
InputStream inputStream = copyStream.getIS();

これが誰かに役立つことを願っています。これがコードです。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class CopyInputStream {

private InputStream inputStream;
private ByteArrayOutputStream byteOutPutStream;

/*
 * Copies the InputStream to be reused
 */
public CopyInputStream(InputStream is){
    this.inputStream = is;
    try{
        int chunk = 0;
        byte[] data = new byte[256];

        while(-1 != (chunk = inputStream.read(data)))
        {
            byteOutPutStream.write(data, 0, chunk);
        }
    }catch (Exception e) {
        // TODO: handle exception
    }
}
/*
 * Calls the finished inputStream
 */
public InputStream getIS(){
    return (InputStream)new ByteArrayInputStream(byteOutPutStream.toByteArray());
}

}

于 2012-06-27T14:06:54.993 に答える