2017-08-31 112 views
0

我在我的應用程序中使用相機拍攝圖像,當切換到前置相機時,圖像爲mirrorrd。我使用此代碼拍攝照片(旋轉並補償鏡子) 使用此代碼後置攝像頭即可(無需鏡像和旋轉)! 但前置攝像頭的結果是類似這樣的畫面:使用方向圖像圖像正面或背面相機

enter image description here

這種方法得到前置攝像頭ID: (我用CameraInfo獲得前置攝像頭ID併發送ID導致活動)

public int getFrontFacingCameraId() { 
     int numCameras = getNumberOfCameras(); 
     Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
     for (int cameraId = 0; cameraId < numCameras; cameraId++) { 
      Camera.getCameraInfo(cameraId, cameraInfo); 
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       return cameraId; 
      } 
     } 
     return 0; 
    } 

此代碼爲旋轉:(使用基質)

private Bitmap rotateImage(Bitmap source, float angle) { 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(angle); 
      return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); 
      return source; 
     } 
    } 

和在活動RESU此代碼使用LT:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 
      case PICTURE_RESULT: 
       if (resultCode == Activity.RESULT_OK) { 
        try { 
         Bitmap thumbnail = MediaStore.Images.Media.getBitmap(getContentResolver(), IMG_URI); 
         Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
         int rotation = this.getWindowManager().getDefaultDisplay().getRotation(); 
         int degrees = 0; 
         switch (rotation) { 
          case Surface.ROTATION_0: 
           degrees = 90; 
           break; 
          case Surface.ROTATION_90: 
           degrees = 180; 
           break; 
          case Surface.ROTATION_180: 
           degrees = 270; 
           break; 
          case Surface.ROTATION_270: 
           degrees = 360; 
           break; 
         } 
         int displayOrientation; 
         if (cameraInfo.facing == getFrontFacingCameraId()) { 
          displayOrientation = (cameraInfo.orientation + degrees) % 360; 
          displayOrientation = (360 - displayOrientation) % 360; 
         } else { 
          displayOrientation = (cameraInfo.orientation - degrees + 360) % 360; 
         } 
         USER_CIRCLE_PHOTO.setImageBitmap(Bitmap.createScaledBitmap(rotateImage(thumbnail, displayOrientation), 480, 800, false)); 
         getContentResolver().delete(IMG_URI, null, null); 
        } catch (Exception e) { 
         displayToast(this, "خطای گرفتن عکس:" + "\n" + e.toString()); 
        } 
       } 
     } 
    } 

我怎樣才能解決這個問題 謝謝

當改成這樣:

case Surface.ROTATION_0: 
           degrees = 0; 
           break; 
          case Surface.ROTATION_90: 
           degrees = 90; 
           break; 
          case Surface.ROTATION_180: 
           degrees = 180; 
           break; 
          case Surface.ROTATION_270: 
           degrees = 270; 
           break; 

結果: enter image description here

enter image description here

回和相機不行!

回答

2
/***Inside your Picture Taken Call back try to change**/ 

private PictureCallback mPicture = new PictureCallback() 
{ 

@Override 
public void onPictureTaken(byte[] data, Camera camera) 
{ 

    pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 

    if (pictureFile == null) 
    { 
     return; 
    } 

    try 
    { 
     path = pictureFile.getPath(); 
     FileOutputStream fos = new FileOutputStream(pictureFile); 

     fos.write(data); 
     fos.close(); 
     if (pictureFile.exists()) 
     { 

      Bitmap largeIcon = BitmapFactory.decodeFile(pictureFile.getAbsolutePath()); 


      if(cameraId == CameraInfo.CAMERA_FACING_BACK) 
      { 
       imageRotation(largeIcon); 



      } 
      else 
      { 

       rotateFrontImage(largeIcon); 



      } 






     } 



     /* * Make the callback to the calling activity to handle picture 
     * clicked*/ 

     mCallback.imageClicked(pictureFile); 


    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 

    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

}; 

/***********************************************/ 

public Bitmap rotateFrontImage(Bitmap source) 
{ 

Bitmap rImg; 

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) 
{ 

    Bitmap imgBitmap = source; 

    ExifInterface ei = null; 
    try 
    { 

     ei = new ExifInterface(path); 

     int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 


     switch(orientation) 
     { 
      case ExifInterface.ORIENTATION_ROTATE_90: 
       imgBitmap = rotateImage(source, 90); 


       break; 
      case ExifInterface.ORIENTATION_ROTATE_180: 
       imgBitmap = rotateImage(source, 180); 


       break; 
      case ExifInterface.ORIENTATION_ROTATE_270: 
       imgBitmap = rotateImage(source, 270); 


       break; 


     } 

    } catch (IOException e) 
    { 
     e.printStackTrace(); 

        } 

    Matrix rotateRight = new Matrix(); 
    rotateRight.preRotate(270); 

    if(android.os.Build.VERSION.SDK_INT>13 && cameraId == CameraInfo.CAMERA_FACING_FRONT) 
    { 

     float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1}; 
     //rotateRight = new Matrix(); 
     Matrix matrixMirrorY = new Matrix(); 
     matrixMirrorY.setValues(mirrorY); 

     rotateRight.postConcat(matrixMirrorY); 

     Log.i(TAG, "rotateFrontImage if mirrorY: "+mirrorY); 
     Log.i(TAG, "rotateFrontImage if matrixMirrorY: " + matrixMirrorY); 


    } 

    rotateRight.preRotate(90); 

    rImg= Bitmap.createBitmap(imgBitmap, 0, 0, imgBitmap.getWidth(), imgBitmap.getHeight(), rotateRight, true); 


} 

else 
{ 



    Matrix rotateRight = new Matrix(); 
    rotateRight.preRotate(270); 

    if(android.os.Build.VERSION.SDK_INT>13 && cameraId == CameraInfo.CAMERA_FACING_FRONT) 
    { 


     float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1}; 
     rotateRight = new Matrix(); 
     Matrix matrixMirrorY = new Matrix(); 
     matrixMirrorY.setValues(mirrorY); 

     rotateRight.postConcat(matrixMirrorY); 

     Log.i(TAG, "rotateFrontImage else mirrorY: "+mirrorY); 
     Log.i(TAG,"rotateFrontImage else matrixMirrorY: "+matrixMirrorY); 

     rotateRight.preRotate(270); 

    } 

    rImg= Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), rotateRight, true); 


} 

return rImg; 
} 
+0

不適合我! –