работа с большими изображениями в Android - PullRequest
4 голосов
/ 05 сентября 2011

У меня есть приложение на Android, в котором я работаю с действительно большими изображениями (640x480) и чуть больше. На самом деле это снимки, сделанные камерой, затем редактируются, после чего сохраняются в 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));

И все равно ничего .... та же ошибка .... out of memory.

Кто-нибудь есть идеи?

P.S .: Я также пытался дозвониться до System.gc(), но с тем же результатом!

Так что, пожалуйста, помогите мне!

1 Ответ

0 голосов
/ 06 сентября 2011

Используйте приведенный ниже код для изменения размера изображения

`

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

`

...