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 更改为无法正确解码流的状态。

我的问题是有另一种重置 BitmapFactory.Options 的方法吗?或其他可能的解决方案?

另一种方法:(注意*应用top方法时originalBitmap为null)

这是我的原始代码:

Bitmap originalBitmap = BitmapFactory.decodeStream(InpStream);

应用 Deev 和 Nobu Game 的建议:(没有变化)

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

3 回答 3

5

您正在尝试从同一流中读取两次。流不能用作字节数组。一旦您从中读取数据,您将无法再次读取它,除非您重置流位置。您可以在第一次调用 decodeStream() 后尝试调用 InputStream.reset() 但并非所有 InputStreams 都支持此方法。

于 2012-06-27T00:10:13.390 回答
0

如果您尝试重用您的 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 回答