Чтение огромных изображений с SD CARD и сохранение их размеров (из памяти!) - PullRequest
2 голосов
/ 12 октября 2011

Я пытаюсь прочитать изображения с SD-карты и сохранить их в своем пользовательском каталоге, размер которого изменился до 1024 пикселей, но я всегда получал OutOfMemory.Я пробовал большинство примеров, которые я нашел здесь в stackoverflow, об этом персонале «не хватает памяти» ...

Я спрашивал меня, как приложение Galería так легко управляет изображениями 4000 пикселей ???

Спасибо.Дэвид.

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

Я спрашивал меня, как приложение Galería так легко управляет изображениями 4000 пикселей?

В нем используется BitmapFactory.Options.inSampleSize в сочетании с методами декодирования BitmapFactory для загрузки уменьшенного размера миниатюры с диска.Он также размещает изображения на изображениях и загружает определенную часть изображения только при увеличении.

1 голос
/ 12 октября 2011

В Android мобильное приложение ограничено в памяти, поэтому никто никогда бы не подумал о загрузке таких огромных Bitmap подобных (4000px) в память.Вот несколько советов, как справиться с этой ситуацией:

  1. Изменить размер изображения, чтобы подогнать его под экран (лучше подходит отображение экрана)
  2. Снизить качество до приемлемого уровня (тогда как глаза пользователей не чувствуютразличия, возможно)
  3. Не показывать слишком много Bitmap изображений одновременно.
  4. Избегайте слишком большого использования getPixel() и setPixel, это приведет к действительно очень плохомуспектакль.Вместо этого используйте getPixels() и setPixels().
  5. После завершения использования Bitmap, recycle() для освобождения памяти (GC знает, что делать на этом этапе).
  6. Непопытайтесь создать так много ссылок на Bitmap объекты, что вы убьете себя потом !!!
1 голос
/ 12 октября 2011

Пожалуйста, попробуйте следующий код. Надеюсь, это поможет.

Bitmap bMap = BitmapFactory.decodeFile (photoPath);

    int orig_width = bMap.getWidth();
    int orig_height = bMap.getHeight();
    int aspect = orig_width / orig_height;

    float aspectRatio = orig_width / orig_height;

    int new_height = (int) (orig_height / (aspectRatio));
    int new_width = (int) ((orig_width * aspectRatio)/2);

    Bitmap scaled = Bitmap.createScaledBitmap(bMap, new_height, new_width, true);

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    scaled.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos); 
    byte[] bitmapdata = bos.toByteArray();

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = 5; 

    File sdImageMainDirectory = Environment.getExternalStorageDirectory();
    FileOutputStream fileOutputStream = null; 
    String tempFile = "tempImage"; 
    int quality = 50; 

    Bitmap myImage = BitmapFactory.decodeByteArray(bitmapdata, 0,bitmapdata.length);

    try {
        fileOutputStream = new FileOutputStream(sdImageMainDirectory.toString() +"/" + tempFile + ".jpg");
        BufferedOutputStream bosBufferedOutputStream = new BufferedOutputStream(fileOutputStream); 

        myImage.compress(CompressFormat.JPEG, quality, bosBufferedOutputStream); 
        bosBufferedOutputStream.flush();
        bosBufferedOutputStream.close(); 
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
0 голосов
/ 12 февраля 2013

отправить:

                        BitmapFactory.Options o = new BitmapFactory.Options(); 
                    o.inJustDecodeBounds = true; 
                    BitmapFactory.decodeFile(filePath, o); 

                    int REQUIRED_SIZE = 640; 
                    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
                    int scale = 1; 
                    while(true) { 
                        if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) break; 
                        width_tmp /= 2; 
                        height_tmp /= 2; 
                        scale *= 2; 
                    } 

                    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
                    o2.inSampleSize = scale; 
                    Bitmap bitmap = BitmapFactory.decodeFile(filePath, o2); 

                    ByteArrayOutputStream bs2 = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.PNG, 90, bs2);
                    getIntent().putExtra("byte_picture", bs2.toByteArray());

Получите:

Bitmap photo = BitmapFactory.decodeByteArray(data.getByteArrayExtra("byte_picture"),0,data.getByteArrayExtra("byte_picture").length);
...