我想要实现的是能够从输入流计算位图的高度和宽度,而无需实际更改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);
答案 0 :(得分:5)
您试图从同一个流中读取两次。流不能用作字节数组。一旦从中读取数据,除非重置流位置,否则无法再次读取数据。您可以在第一次调用decodeStream()之后尝试调用InputStream.reset(),但并非所有InputStream都支持此方法。
答案 1 :(得分:0)
如果您正在尝试重用您的Options对象(顺便说一下,您的代码示例中不是这种情况),那么您如何重用它?什么是错误信息,出了什么问题? 您是否尝试重用Options对象来实际解码Bitmap?然后将inJustDecodeBounds设置为false。
答案 2 :(得分: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());
}
}