我正在开发一个Android应用程序,我必须将图像从SD卡上传到互联网。为此我使用 MediaStore 内容提供商并从 MediaStore.Images.Media.DATA 列获取图像路径,现在我正在做的是创建位图使用 Bitmap.decodeFile(String path)方法从该路径开始,然后在列表中的 ImageView 中显示该位图。我面临的问题是,当我尝试进入列表中显示此图像的活动时,我收到如下错误 10-20 11:10:47.070:ERROR / AndroidRuntime(922):java.lang .OutOfMemoryError:位图大小超过VM预算
任何人都可以建议我解决这个问题,或者另一种方法来实现我的目标。提前谢谢。
答案 0 :(得分:1)
这种情况很多时候会导致存储在SD卡中的图像具有高分辨率,并且您的应用无法将图像大小处理成堆大小
使用以下行获取位图
Bitmap bmp = Bitmap.decodeFile(String path)
您应尝试将缩小到所需的尺寸
newBmp = Bitmap.createScaledBitmap(bmp, 240, 320, true);
然后使用newBmp
在您的视图中进行设置。
答案 1 :(得分:1)
下面的代码用于调整所选图像的大小
Bitmap bitmap = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream());
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int newWidth = 100;
int newHeight = 100;
// calculate the scale - in this case = 0.4f
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// createa matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
width, height, matrix, true);
((ImageView) findViewById(R.id.ImageviewTest)).setImageBitmap(resizedBitmap);
答案 2 :(得分:0)
String filepath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
File file = new File(filepath, filename);
FileInputStream fs;
try {
fs = new FileInputStream(file);
BitmapFactory.Options bfOptions = new BitmapFactory.Options();
/*
* bfOptions.inDither=false; //Disable Dithering mode
* bfOptions.inPurgeable=true; //Tell to gc that whether it needs
* free memory, the Bitmap can be cleared
* bfOptions.inInputShareable=true;
*/
bfOptions.inJustDecodeBounds = false;
bfOptions.inTempStorage = new byte[32 * 1024];
Bitmap b = BitmapFactory.decodeFileDescriptor(fs.getFD(), null,
bfOptions);
img.setImageBitmap(b);
}
catch()
{
}