我在android中有一个应用程序,我正在使用非常大的图像(640x480)
并稍微大一些。这实际上是用相机拍摄的照片,然后进行编辑,然后保存到{{1}最后上传到服务器。
但在使用sdcard
时,我遇到的问题是VM memory exceeded
。
我正在做这样的事情:
在我收到bitmaps
的第一个活动中,创建一个the bytes from the camera
,然后对其进行编辑,然后保存到bitmap
sdcard
在 BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
options.inDither = true;
byte[] imageData = extras.getByteArray("imageData");
myImage = BitmapFactory.decodeByteArray(imageData, 0,
imageData.length, options);
Matrix mat = new Matrix();
mat.postRotate(90);
if(myImage !=null){
bitmapResult = Bitmap.createBitmap(myImage.get(), 0, 0, (myImage.get()).getWidth(),
(myImage.get()).getHeight(), mat, true);
方法中我这样做了:
onPause()
在我的第二个活动中,我正在从 bitmapResult.recycle();
bitmapResult=null;
读取文件并将其显示在屏幕上。为什么?我有我的理由:
sdcard
在File f=new File("/sdcard/Images/android.jpg");
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inTempStorage = new byte[16*1024];
o2.inSampleSize=8;
o2.outWidth=100;
o2.outHeight=100;
try {
x = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(x != null){
myImage.setImageBitmap(x);
}
onPause()
这一切都没有用,拍了几张照片后,我的应用程序崩溃了。
我尝试使用x.recycle();
x=null;
代替WeaakReference
:
bitmap
仍然没有......同样的错误.... myImage = new WeakReference<Bitmap>(BitmapFactory.decodeByteArray(imageData, 0,
imageData.length, options));
。
有人有任何想法吗?
P.S:我也试着打电话给out of memory
,但结果相同!
所以请帮助我!
答案 0 :(得分:0)
使用以下代码调整图片大小
`
Bitmap bmp = BitmapFactory.decodeFile(imageFilePath);
int width = bmp.getWidth();
int height = bmp.getHeight();
float scaleWidth = ((float) 300) / width;
float scaleHeight = ((float) 300) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(bmp, 0, 0, width,
height, matrix, true);
ByteArrayOutputStream baostream = new ByteArrayOutputStream();
resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100, baostream);
`