2014-01-23 5 views
1

Цель программы: Пользователь может разместить одно изображение в верхней части предварительного просмотра камеры и перемещать его свободно (изображение имеет большой размер 1920x1080 пикселей) и может хранить эти два слоя (изображение и предварительный просмотр камеры), нажимая кнопку фото. Пока он может сохранить только одну фотографию, потому что, когда он берет второй, появляется проблема с ошибкой памяти.Предварительный просмотр камеры Ошибка в памяти

Решение Похоже, что проблема может быть решена, если вы используете функцию растрового изображения, если вам больше не нужно использовать растровые изображения. Или вы можете изменить их размер (не хотел) ... Являются ли эти хорошие идеи?

Код:

private PictureCallback mPicture = new PictureCallback() 
{ 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) 
    { 
     File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
     mPreview.setDrawingCacheEnabled(true); 
     mPreview.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_AUTO); 
     Bitmap bitmap = mPreview.getDrawingCache(); 
     bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
     combination = overlay(bmp, bitmap); 

     if(pictureFile == null) 
     { 
      return; 
     } 
     try 
     { 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      combination.compress(CompressFormat.JPEG, 100, fos); 
      fos.flush(); 
      fos.close(); 
      File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES), "MyCameraApp"); 
       sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
        Uri.parse("file://"+ mediaStorageDir))); 
     } 
     catch(FileNotFoundException e) 
     { 
      Log.d(TAG, "File not found: "+e.getMessage()); 
     } 
     catch(IOException e) 
     { 
      Log.d(TAG, "Error accessing file: "+e.getMessage()); 
     } 
    } 

}; 

public static Bitmap overlay(Bitmap bmp1, Bitmap bmp2) 
{ 
    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(),bmp1.getConfig()); 
    Canvas canvas = new Canvas(bmOverlay); 
    canvas.drawBitmap(bmp1, new Matrix(), null); 
    canvas.drawBitmap(bmp2, null, new Rect(0,0,bmp1.getWidth(), bmp1.getHeight()), null); 
    return bmOverlay;  
} 

private static File getOutputMediaFile(int type) 
{ 
    File mediaFile = null; 

    if(isSdPresent() == false) 
    { 
     Log.d(TAG, "There is no Sd card. Cannot use the camera"); 
    } 

    else 
    { 
     File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "World Cup Camera"); 

     if(!mediaStorageDir.exists()) 
     { 
      if(!mediaStorageDir.mkdirs()) 
      { 
       Log.d("WorldCupApp", "failed to create directory"); 
       return null; 
      } 
     } 

     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());  

     if (type == MEDIA_TYPE_IMAGE) 
     {   
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");  
     } 

     else 
     {  
      return null; 
     }   
    } 
    return mediaFile; 
} 

Я слышал об этом коде я должен использовать?

private Bitmap decodeFile(File f) 
{ 
    try 
    { 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     //The new size we want to scale to 
     final int REQUIRED_SIZE=70; 

     //Find the correct scale value. It should be the power of 2. 
     int scale=1; 
     while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE) 
      scale*=2; 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } 
    catch (FileNotFoundException e) {} 
    return null; 
} 

ответ

3

Вы можете использовать android:largeHeap="true" внутри тега приложения на AndroidManifest, когда вы испытываете OutOfMemory ошибки.

+0

Я попробую с ним, спасибо ^^ – pb77

Смежные вопросы