2016-08-25 47 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

很酷。然后我相信我的代码将解决您的问题 –