在android中使用大图像

时间:2011-09-05 08:20:58

标签: android bitmap weak-references

我在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,但结果相同!

所以请帮助我!

1 个答案:

答案 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);

`