2016-08-25 49 views
1

我正在使用GPUImage android庫在相機預覽上應用濾鏡,並在拍攝照片後使用應用的濾鏡保存圖像。問題是,當我拍攝該照片時,我無法使用濾鏡獲取圖像。 我使用下面的代碼:使用GPUImage將應用的濾鏡保存在相機預覽中

@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

    mGPUImage.setImage(bitmap); 
    bitmap = mGPUImage.getBitmapWithFilterApplied(); 
    saveImage(bitmap); 
} 

在GPUImage的庫頁(https://github.com/CyberAgent/android-gpuimage/#sample-code)的代碼示例說:

隨着預覽:

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity); 

    Uri imageUri = ...; 
    mGPUImage = new GPUImage(this); 
    mGPUImage.setGLSurfaceView((GLSurfaceView) findViewById(R.id.surfaceView)); 
    mGPUImage.setImage(imageUri); // this loads image on the current thread, should be run in a thread ?? (can't understand this line) 
    mGPUImage.setFilter(new GPUImageSepiaFilter()); 

    // Later when image should be saved saved: 
    mGPUImage.saveToPictures("GPUImage", "ImageWithFilter.jpg", null); 
} 

即使他們的樣本中,我不能救帶過濾器的圖像。 請有人能解釋給我?

+0

您可以將圖像保存,但濾波效果丟失,對不對? –

+0

不,既不保存圖像 –

+0

@ Luiz Henrique Alegria嘗試我的代碼,並檢查Android Menifest中的寫入權限。 –

回答

2

使用此代碼

///Call this method when you are ready to save image/// 
    //I am calling on click of save button// 

    private void takePhoto() { 
      releaseCamera(); 
      new AsyncTask<Void, Void, Void>() { 
       Bitmap bitmap; 

       @Override 
       protected void onPreExecute() { 
        super.onPreExecute(); 
        try { 
         bitmap = gpuImageView.capture(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 

       @Override 
       protected Void doInBackground(Void... params) { 
        File dir = Util.getCameraDirectory(); // directory where you want to save image 
        if (!dir.exists()) { 
         dir.mkdirs(); 
        } 
        String filename = getString(R.string.app_name) + System.currentTimeMillis() + ".jpg"; 
        File file = new File(dir, filename); 
        try { 
         FileOutputStream fileOutputStream = new FileOutputStream(file); 
         bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream); 

         fileOutputStream.flush(); 
         fileOutputStream.close(); 

         Intent intent = 
           new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
         intent.setData(Uri.fromFile(file)); 
         sendBroadcast(intent); 
        } catch (Exception exception) { 
         exception.printStackTrace(); 
        } 

        return null; 
       } 

       @Override 
       protected void onPostExecute(Void aVoid) { 
        super.onPostExecute(aVoid); 
        prepareCamera(); 
        Toast.makeText(MyActivity.this, R.string.msg_after_save, Toast.LENGTH_SHORT).show(); 
       } 
      }.execute(); 
     } 

     private void prepareCamera() { 
      camera = Camera.open(cameraId); 
      Camera.Parameters parameters = camera.getParameters(); 
      Camera.Size size = getOptimalPreviewSize(camera.getParameters().getSupportedPreviewSizes(), getWindowManager().getDefaultDisplay().getWidth(), getWindowManager().getDefaultDisplay().getHeight()); 
      parameters.setPreviewSize(size.width, size.height); 
      if (parameters.getSupportedFocusModes().contains(
        Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { 
       parameters 
         .setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
      } 
      parameters.setPreviewFormat(ImageFormat.NV21); 
      camera.setParameters(parameters); 

      Camera.CameraInfo info = new Camera.CameraInfo(); 
      Camera.getCameraInfo(cameraId, info); 
      int orientation = getCameraDisplayOrientation(info); 
      boolean flipHorizontal = info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT; 
      gpuImageView.getGPUImage().setUpCamera(camera, orientation, 
        flipHorizontal, false); 
     } 

     private void releaseCamera() { 
      if (camera != null) { 
       camera.stopPreview(); 
       camera.setPreviewCallback(null); 
       camera.release(); 
       camera = null; 
      } 
     } 

讓我知道,如果你面對任何進一步的問題。

同時,再次檢查寫權限清單中

+0

我會測試你的代碼,但我可以說權限很好 –

+0

很酷。然後我相信我的代碼將解決您的問題 –