Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Front Facing Camera Taking Inverted Photos

Tags:

android

camera

I have this app that is running in portrait mode and as a part of one activity I have a camera object running as a fragment in it.

I have the option to switch from front to back-facing camera and when taking photos with the back camera all is fine and well.

When I take photos with the front-facing camera though, they get inverted 180 degrees. Now I know that this is probably something to do with the orientation being in portrait mode, but having it in landscape would just kill the idea of my application.

Is there anyway this can be fixed so the picture taken is the same as the one you see in the preview?

        listener = new OrientationEventListener(this.getActivity(),SensorManager.SENSOR_DELAY_NORMAL){

        @Override
        public void onOrientationChanged(int orientation) {
            // TODO Auto-generated method stub
            if (orientation == ORIENTATION_UNKNOWN) return;
             android.hardware.Camera.CameraInfo info =
                    new android.hardware.Camera.CameraInfo();
             android.hardware.Camera.getCameraInfo(mCurrentCamera, info);
             orientation = (orientation + 45) / 90 * 90;
             int rotation = 0;
             if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
                 rotation = (info.orientation - orientation + 360) % 360;
             } else {  // back-facing camera
                 rotation = (info.orientation + orientation) % 360;
             }
             if (mCamera.getParameters() != null){
             Camera.Parameters mParameters = mCamera.getParameters();

             mParameters.setRotation(rotation);
             mCamera.setParameters(mParameters);
             }
        }

    };
    listener.enable();
    if (listener.canDetectOrientation())
        Log.d("Orientation Possible", "Orientation Possible");

The problem is, after I try an take a picture this thing crashes. Also, if it runs for a while just in preview mode it crashes again. I also should probably add, that in another method I am doing this.

   public void switchCamera(Camera camera) {
    setCamera(camera);
    try {
        camera.setPreviewDisplay(mHolder);
    } catch (IOException exception) {
        Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
    }
    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);

    requestLayout();


    try{
        camera.setParameters(parameters);
    }
    catch (RuntimeException ex){
        Log.d("Preview", "Failure to set proper parameters");
        //need to improve this method
        if (mSupportedPreviewSizes != null) {
            Camera.Size cs = mSupportedPreviewSizes.get(0);
            parameters.setPreviewSize(cs.width, cs.height);
            camera.setParameters(parameters);
            requestLayout();
            //int tempheight = mPreviewSize.height;
            //mPreviewSize.height = mPreviewSize.width;
            //mPreviewSize.width = tempheight;

        }
    }

This is called when you switch between cameras(back facing to front facing vice-versa). Could this be interfering with the orientation event listener?

Also, when saving the picture taken, this is what I call. Before it was just taking in data as a parameter, but I tried to make it take screen orientation as well. The problem is the screen orientation is always 90, no matter what. So the bitmap will always be rotated by 90 degrees(which is great for taking photos with the back camera) but inverts it when taking it with the front camera. Could a fix be implemented in this function?

  public static Bitmap MakeSquare(byte[] data, int orientation) {
    int width;
    int height;
    // Rotate photo
    Matrix matrix = new Matrix();
    matrix.postRotate(orientation);
    // Convert ByteArray to Bitmap
    Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length);
    width = bitPic.getWidth();
    height = bitPic.getHeight();


    // Create new Bitmap out of the old one
    Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true);
    bitPic.recycle();
    int desWidth;
    int desHeight;
    desWidth = bitPicFinal.getWidth();
    desHeight = desWidth;
    Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight);
    croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true);
    return croppedBitmap;
}
like image 739
Valentin Avatar asked Apr 23 '12 15:04

Valentin


People also ask

Why does my front camera invert my photo?

Android smartphone usually default to a mirrored photo when you take selfies. Here's how to flip them the right way round. Most phones save photos taken with the front-facing camera exactly as they appear in the preview.

How do I stop my front camera from inverting?

Follow these steps to stop iPhone selfies from mirroring, flipping, or turning around automatically: Open the Settings app and tap Camera. Turn on the switch for Mirror Front Camera or Mirror Front Photos. Open the Camera app and switch to the front camera to take mirrored selfies.

Why does my camera keep inverting my photos?

The image flips automatically to avoid the "mirror effect". If you look in the front camera from the app you see things like in a mirror. When you take the pic, it flips automatically to correspond to the reality.


2 Answers

Well well. It seems I have kind of taken care of it. I used the advice from this: Android, front and back camera Orientation , Landscape

And changed my MakeSquare function to this:

public static Bitmap MakeSquare(byte[] data, int cameraID) {
    int width;
    int height;
    Matrix matrix = new Matrix();
    Camera.CameraInfo info = new Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraID, info);
    // Convert ByteArray to Bitmap
    Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length);
    width = bitPic.getWidth();
    height = bitPic.getHeight();

    // Perform matrix rotations/mirrors depending on camera that took the photo
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
    {
        float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1};
        Matrix matrixMirrorY = new Matrix();
        matrixMirrorY.setValues(mirrorY);

        matrix.postConcat(matrixMirrorY);
    }

    matrix.postRotate(90);


    // Create new Bitmap out of the old one
    Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true);
    bitPic.recycle();
    int desWidth;
    int desHeight;
    desWidth = bitPicFinal.getWidth();
    desHeight = desWidth;
    Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight);
    croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true);
    return croppedBitmap;
}

This seems to work and do the trick. Although I am not sure this was the best way, I am content with it. Now all I have to do is figure out why its not taking in the proper aspect ratio when using the front camera.

like image 159
Valentin Avatar answered Oct 23 '22 01:10

Valentin


Give these links a try:

http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setRotation(int)

Specifically, here is a chunk of verbiage from the setRotation link.

"If applications want to rotate the picture to match the orientation of what users see, apps should use OrientationEventListener and Camera.CameraInfo. The value from OrientationEventListener is relative to the natural orientation of the device. CameraInfo.orientation is the angle between camera orientation and natural device orientation. The sum of the two is the rotation angle for back-facing camera. The difference of the two is the rotation angle for front-facing camera. Note that the JPEG pictures of front-facing cameras are not mirrored as in preview display."

I used this code as-is, didn't modify it at all. My camera is better now, still needs some TLC though. I also don't have front-facing functionality yet.

Good luck!

like image 29
JustSomeGuy Avatar answered Oct 22 '22 23:10

JustSomeGuy