2015-02-25 2 views
2

Я работаю над приложением для обработки изображений, и мне нужно разделить полученную фотографию на четыре области, но использование BitmapFactoy требует слишком много ресурсов и времени и замедляет меня, я хотел бы сделать это используя raw byte [] данные, которые дает мне public void onPictureTaken(byte[] data, Camera camera). Прямо сейчас это то, что я делаю, и я хочу, чтобы улучшить его использовать байт [], чтобы ускорить его:Crop Изображение, снятое камерой без использования растрового изображения

public void onPictureTaken(byte[] data, Camera camera) { 
      new AsyncImageAnalyzer(data).execute(); 
      data = null; 
     } 

public AsyncImageAnalyzer(byte[] d) { 
     mData = d; 
     surfaceView = null; 
    } 



@Override 
    protected Void doInBackground(Void... params) { 

     FileOutputStream fos2 = null; 
     try { 

      String fileName = Long.toString(Calendar.getInstance().getTimeInMillis())+".jpg"; 
      String storageState = Environment.getExternalStorageState(); 
      if (storageState.equals(Environment.MEDIA_MOUNTED)) { 
       File file = new File(/*"/sdcard/XXX"*/Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"XXX", 
         fileName); 
       /*file.createNewFile();*/ 
       fos2 = new FileOutputStream(file); 
       fos2.write(mData,0,mData.length); 
       fos2.flush(); 
       fos2.close(); 
       /*fos2.write(mData);*/ 
       /*fos2.close();*/ 

       if(extrasReceived.equals("1")){ 
        spe.putString("FirstPicPath","/"+fileName).commit(); 
       }else { 
        spe.putString("SecondPicPath","/"+fileName).commit(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.e("ISA exception",e.getMessage()); 
     }finally { 
      try { 
       if (fos2 != null) { 
        fos2.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 

     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = sp.getInt("compression_ratio",1); 
     bitmap = BitmapFactory.decodeByteArray(mData, 0, mData.length,options); 
     mData = null; 


     t1G = Bitmap.createBitmap(bitmap, 0, (bitmap.getHeight()/2) - 1, bitmap.getWidth()/2, bitmap.getHeight()/2); 
     t2G = Bitmap.createBitmap(bitmap, (bitmap.getWidth()/2) - 1, (bitmap.getHeight()/2) - 1, bitmap.getWidth()/2, bitmap.getHeight()/2); 
     t1R = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth()/2, bitmap.getHeight()/2); 
     t2R = Bitmap.createBitmap(bitmap, (bitmap.getWidth()/2) - 1, 0, bitmap.getWidth()/2, bitmap.getHeight()/2); 



     try { 
      t2RtoInt = getDominantColor(t2R); 
      t1RtoInt = getDominantColor(t1R); 
      t1GtoInt = getDominantColor(t1G); 
      t2GtoInt = getDominantColor(t2G); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.e("exception", e.getMessage()); 
     } 

     return null; 
    } 

Кроме того, любой совет для меня, что причины ускорения в этих операциях будут оценены.

+1

Используйте Traceview, чтобы определить, где лежит ваша проблема. Я бы подумал, что место кучи будет гораздо более серьезной проблемой, чем скорость процессора. – CommonsWare

+0

Спасибо, что упомянул об этом. Я знаю, что пустое пространство - проблема, но в будущих версиях проблема кучи будет решена, так как я использую растровые изображения только для предварительного просмотра прямо сейчас, и они будут удалены в будущем, но поскольку мне нужно проверить каждый пиксель изображения в «getDominantColor (...) «это будет замедлено навсегда, и мой первый приоритет - сократить время, избегая использования растрового изображения. –

+1

@CommonsWare есть способ обрезать изображение без использования Bitmap, чтобы ускорить его для дальнейшей обработки? –

ответ

3

Вы когда-нибудь задумывались о BitmapRegionDecoder (В настоящее время поддерживаются только форматы JPEG и PNG)? Если вы разрабатываете приложение с уровнем API 10 и выше, вы можете использовать этот API для ускорения обработки больших битмапов.

boolean isShareable = false; 
    try { 
     InputStream is = new FileInputStream("/mnt/sdcard/test.png"); 
     Rect rect = new Rect(); 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     BitmapRegionDecoder.newInstance(is, isShareable).decodeRegion(rect, options); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

Я получаю байт [] с камеры, кроме того, как мне исправить размер Rect? –

+0

используйте 'BitmapFactory' с' options.inJustDecodeBounds = true; 'чтобы получить размер вашего растрового изображения, а затем вычислить прямоугольник. – alijandro

+0

Извините, что я полностью забыл об этом, но мой пользователь фактически использует Android 2.3, и я ДОЛЖЕН поддерживать Android 2.3. спасибо за ваш ответ, но мне действительно нужно поддержать Gingerbread. –

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