2016-07-07 114 views
0

我有一個名爲「SaveImageTask」的內部類,它在後臺工作,並從相機保存拍攝的圖像,然後我使用Intent到另一個名爲「MainActivity2」的類,我想在這裏顯示圖像,在這裏是代碼:保存圖像並顯示它

private class SaveImageTask extends AsyncTask<byte[], Void, Void> { 

    @Override 
    protected Void doInBackground(byte[]... data) { 
     FileOutputStream outStream = null; 
     try { 
      File sdCard = Environment.getExternalStorageDirectory(); 
      File dir = new File(sdCard.getAbsolutePath() + "/SelfieLightCamera"); 
      dir.mkdirs(); 
      String fileName = String.format("%d.jpg", System.currentTimeMillis()); 
      File outFile = new File(dir, fileName); 
      outStream = new FileOutputStream(outFile); 
      b = flip(BitmapFactory.decodeByteArray(data[0], 0, data[0].length)); 
      b.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
      outStream.flush(); 
      outStream.close(); 
      Log.d("pictureTaken", "onPictureTaken - wrote bytes: " + data.length + " to " + outFile.getAbsolutePath()); 
      refreshGallery(outFile); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
     } 
     CameraPreview.safeToTakePicture = true; 
     startActivity(new Intent(MainActivity.this, MainActivity2.class)); 
     return null; 
    } 

    public Bitmap flip(Bitmap bitmap) { 

     int w = bitmap.getWidth(); 
     int h = bitmap.getHeight(); 
     Matrix matrix = new Matrix(); 
     float[] mirrorY = {-1, 0, 0, 0, 1, 0, 0, 0, 1}; 
     Matrix matrixMirrorY = new Matrix(); 
     matrixMirrorY.setValues(mirrorY); 
     matrix.postConcat(matrixMirrorY); 
     matrix.postRotate(90); 
     return Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); 
    } 
} 

MainActivity2.class:

public class MainActivity2 extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 
     ImageView img = (ImageView) findViewById(R.id.imageView); 
     img.setImageBitmap(MainActivity.b); 
    } 
} 

但是,它需要太多的時間,我拍攝圖像,然後將其用的在5秒的延遲顯示,任何方式讓它更有效率?

回答

0

解決方案是在保存前顯示圖像(之前調用的意圖,不同類):

private class SaveImageTask extends AsyncTask<byte[], Void, Void> { 

     @Override 
     protected Void doInBackground(byte[]... data) { 
      FileOutputStream outStream = null; 
      try { 
       b = flip(BitmapFactory.decodeByteArray(data[0], 0, data[0].length)); 
       startActivity(new Intent(MainActivity.this, MainActivity2.class)); 
       File sdCard = Environment.getExternalStorageDirectory(); 
       File dir = new File(sdCard.getAbsolutePath() + "/SelfieLightCamera"); 
       dir.mkdirs(); 
       String fileName = "Picture_" + String.format("%d.jpg", System.currentTimeMillis()); 
       File outFile = new File(dir, fileName); 
       outStream = new FileOutputStream(outFile); 
       b.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
       outStream.flush(); 
       outStream.close(); 
       Log.d("pictureTaken", "onPictureTaken - wrote bytes: " + data.length + " to " + outFile.getAbsolutePath()); 
       refreshGallery(outFile); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
      CameraPreview.safeToTakePicture = true; 
      return null; 
     } 

     public Bitmap flip(Bitmap bitmap) { 

      int w = bitmap.getWidth(); 
      int h = bitmap.getHeight(); 
      Matrix matrix = new Matrix(); 
      float[] mirrorY = {-1, 0, 0, 0, 1, 0, 0, 0, 1}; 
      Matrix matrixMirrorY = new Matrix(); 
      matrixMirrorY.setValues(mirrorY); 
      matrix.postConcat(matrixMirrorY); 
      matrix.postRotate(90); 
      return Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); 
     } 
    }