2013-03-22 5 views
1

Я хочу сохранить растровое изображение на SD-карте, я могу его сохранить, но некоторое время моя активность убита из-за низкого барана.Сохранить растровое изображение в кусках

Так что я могу сохранить изображение в кусках, а сохранить в виде массива байтов.

Мой код, как показано ниже:

try { 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 

     b.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 

     File f = new File(Environment.getExternalStorageDirectory() + File.separator + "temp.jpg"); 
     if (f.exists()) { 
      f.delete(); 
     } 
     f.createNewFile(); 

     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     fo.flush(); 
     fo.close(); 

    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
+0

ли показать какую-либо ошибку, если да, то пожалуйста, напишите Ваше LogCat. – GrIsHu

+0

Нет Гришу, он просто убивает активность и переходит в активную деятельность. Я пробовал это в устройстве с большим количеством бара, в нем все работает нормально, поэтому я пришел к выводу, что это проблема памяти. – Dhrupal

+0

Оформить мой ответ и попытаться его использовать. Конечно, это поможет вам. – GrIsHu

ответ

1

Чтобы уменьшить эту проблему, одна вещь, которую вы можете сделать, это изменить размер от переранжировать изображение, а затем сохраните его в памяти.

Ниже приведен код, который поможет. Вы можете попробовать ниже метода.

// decodes image and scales it to reduce memory consumption 
public static Bitmap decodeFile(File p_f) 
{ 
    try 
    { 
     // decode image size 
     BitmapFactory.Options m_opt = new BitmapFactory.Options(); 
     m_opt.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(p_f), null, m_opt); 
     // Find the correct scale value. It should be the power of 2. 
     final int REQUIRED_SIZE = 70; 
     int m_widthTmp = m_opt.outWidth, m_heightTmp = m_opt.outHeight; 
     int m_scale = 1; 
     while (true) 
     { 
      if (m_widthTmp/2 < REQUIRED_SIZE || m_heightTmp/2 < REQUIRED_SIZE) break; 
      m_widthTmp /= 2; 
      m_heightTmp /= 2; 
      m_scale *= 2; 
     } 
     // decode with inSampleSize 
     BitmapFactory.Options m_o2 = new BitmapFactory.Options(); 
     m_o2.inSampleSize = m_scale; 
     return BitmapFactory.decodeStream(new FileInputStream(p_f), null, m_o2); 
    } 
    catch (FileNotFoundException p_e) 
    { 
    } 
    return null; 
} 

Редакции:

Вы также можете проверить, имеются ли в SDCard или нет, и на основе свободного пространства пространства вы можете сохранить изображение в SDCard. Я использовал метод ниже, чтобы получить свободное пространство или нет.

/** 
* This function find outs the free space for the given path. 
* 
* @return Bytes. Number of free space in bytes. 
*/ 
public static long getFreeSpace() 
{ 
    try 
    { 
     if (Environment.getExternalStorageDirectory() != null 
       && Environment.getExternalStorageDirectory().getPath() != null) 
     { 
      StatFs m_stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); 
      long m_blockSize = m_stat.getBlockSize(); 
      long m_availableBlocks = m_stat.getAvailableBlocks(); 
      return (m_availableBlocks * m_blockSize); 
     } 
     else 
     { 
      return 0; 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     return 0; 
    } 
} 

Используйте выше, как показано ниже:

 if (fileSize <= getFreeSpace()) 
    { 
     //write your code to save the image into the sdcard. 
     } 
     else 
     { 
     //provide message that there is no more space available. 
     } 
+0

Grishu, что такое размер файла? В точке записи размер файла 0 правильно? – Dhrupal

+0

'filesize' - это ваш файл, который у вас есть. – GrIsHu

1

Лучший способ решения этой проблемы заключается в уменьшает размер изображения до нужного размера вида, и делать всю свою тяжелую работу на фоне потоке (Асинхронный Задача), в то время как фоновый поток работает, вы можете показать любой ресурс формы фиктивного изображения, и как только изображение правильно обработано, замените растровое изображение на предыдущее.

После чтения этого, прежде чем приступить

Displaying Bitmaps Efficiently

Processing Bitmaps Off the UI Thread

Load a Scaled Down Version into Memory

Managing Bitmap Memory