从 InputStream 调整位图大小
Posted
技术标签:
【中文标题】从 InputStream 调整位图大小【英文标题】:Resizing bitmap from InputStream 【发布时间】:2012-10-02 05:32:46 【问题描述】:我试图从 InputStream 调整一个图像的大小,所以我使用 Strange out of memory issue while loading an image to a Bitmap object 中的代码,但我不知道为什么这段代码总是返回没有图像的 Drawable。
这个效果很好:
private Drawable decodeFile(InputStream f)
try
InputStream in2 = new BufferedInputStream(f);
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=2;
return new BitmapDrawable(BitmapFactory.decodeStream(in2, null, o2));
catch (Exception e)
return null;
这个不行:
private Drawable decodeFile(InputStream f)
try
InputStream in1 = new BufferedInputStream(f);
InputStream in2 = new BufferedInputStream(f);
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in1,null,o);
//The new size we want to scale to
final int IMAGE_MAX_SIZE=90;
//Find the correct scale value. It should be the power of 2.
int scale = 2;
if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE)
scale = (int)Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE /
(double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inJustDecodeBounds = false;
o2.inSampleSize=scale;
return new BitmapDrawable(BitmapFactory.decodeStream(in2, null, o2));
catch (Exception e)
return null;
为什么一个选项会影响另一个选项?如果我使用两个不同的 InputStream 和 Options 怎么可能?
【问题讨论】:
Resize a large bitmap file to scaled output file on android的可能重复 【参考方案1】:实际上,您有两个不同的BufferedInputStream
,但它们在内部使用唯一一个InputStream
对象,因为BufferedInputStream
只是InputStream
的包装器。
所以你不能在同一个流上调用两次BitmapFactory.decodeStream
方法,它肯定会失败,因为第二次它不会从流的开头开始解码。如果支持,您需要重置您的流或重新打开它。
【讨论】:
明白.. 但是我从 HttpURLConnection 收到这个流,我该怎么做? 你说得对,我没有两个InputStream,就像你说的一个,我在这里学习如何复制InputStream:***.com/questions/5923817/how-to-clone-an-inputstream非常感谢。 您意识到您正在调整位图的大小以改善内存,对吧?但是该链接将使您将整个位图的后备字节数组保存在内存中两次...我将重新打开 FileInputStream 或您再次使用的任何内容。 @andrei-mankevich 这样的 InputStreams(不支持标记/重置)可以简单地包装到 BufferedInputStream 中【参考方案2】:这是我运行良好的代码,我希望这会有所帮助
//Decode image size
BitmapFactory.Options optionsIn = new BitmapFactory.Options();
optionsIn.inJustDecodeBounds = true; // the trick is HERE, avoiding memory leaks
BitmapFactory.decodeFile(filePath, optionsIn);
BitmapFactory.Options optionsOut = new BitmapFactory.Options();
int requiredWidth = ECameraConfig.getEntryById(Preferences.I_CAMERA_IMAGE_RESOLUTION.get()).getyAxe();
float bitmapWidth = optionsIn.outWidth;
int scale = Math.round(bitmapWidth / requiredWidth);
optionsOut.inSampleSize = scale;
optionsOut.inPurgeable = true;//avoiding memory leaks
return BitmapFactory.decodeFile(filePath, optionsOut);
我相信你不需要 2 个 InputStream。
【讨论】:
以上是关于从 InputStream 调整位图大小的主要内容,如果未能解决你的问题,请参考以下文章