用前置摄像头拍摄的照片颠倒了

Posted

技术标签:

【中文标题】用前置摄像头拍摄的照片颠倒了【英文标题】:Picture captured with front camera gets upside down 【发布时间】:2016-07-19 01:23:04 【问题描述】:

我的项目中有自定义相机实现。 当我使用设备的后置摄像头时,它工作正常。 在纵向模式或反向纵向模式下使用前置摄像头拍摄照片时,图像会上下颠倒。在横向模式下,两个摄像头都能正常工作。

我已经实现SensorEventListener并计算SensorChanged回调中的orientation值,以便在捕获的文件中设置ExifInterface.TAG_ORIENTATION

public void onSensorChanged(SensorEvent event) 
        synchronized (this) 
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 


                if (event.values[0] < 4 && event.values[0] > -4) 
                    if (event.values[1] > 0 && orientation != ExifInterface.ORIENTATION_ROTATE_90) 
                        // UP
                        orientation = ExifInterface.ORIENTATION_ROTATE_90;
                     else if (event.values[1] < 0 && orientation != ExifInterface.ORIENTATION_ROTATE_270) 
                        // UP SIDE DOWN
                        orientation = ExifInterface.ORIENTATION_ROTATE_270;
                    
                 else if (event.values[1] < 4 && event.values[1] > -4) 
                    if (event.values[0] > 0 && orientation != ExifInterface.ORIENTATION_NORMAL) 
                        // LEFT
                        orientation = ExifInterface.ORIENTATION_NORMAL;
                     else if (event.values[0] < 0 && orientation != ExifInterface.ORIENTATION_ROTATE_180) 
                        // RIGHT
                        orientation = ExifInterface.ORIENTATION_ROTATE_180;
                    
                

            

        
    

我之所以使用SensorEventListener 是因为当用户旋转屏幕时,我正在为屏幕上的图标添加旋转动画。 这是我的PictureCallback

private Camera.PictureCallback mPictureCallBack = new Camera.PictureCallback() 

        public void onPictureTaken(byte[] data, Camera camera) 
            mCamera.stopPreview();

            File pictureFile = new File(fileName);

            try 
                FileOutputStream purge = new FileOutputStream(pictureFile);
                purge.write(data);
                purge.close();
             catch (FileNotFoundException e) 

             catch (IOException e) 

            

            // Adding Exif data for the orientation.
            try 

                exif = new ExifInterface(fileName);
                exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + orientation);
                exif.saveAttributes();
             catch (IOException e) 
                e.printStackTrace();
            

        
    ;

对于调试,当我将exif.setAttribute()orientation 值设置为ExifInterface.ORIENTATION_ROTATE_90 时,如果它是ExifInterface.ORIENTATION_ROTATE_270,反之亦然,它工作正常。 我的问题是什么是解决这个问题的最佳和确定的方法,以便它最适合所有设备。

Note : 在整个过程中我没有使用位图。我正在将data 写入文件并将其发送回另一个活动以显示捕获的图像。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

我前段时间遇到过这个问题。当您使用前置镜头相机时,我所做的是旋转图像以处理设备的负旋转。因此,要转换您的旋转,您必须执行以下操作:

  //check first in which camera we are
public boolean isFrontCamera(int cameraIndex) 
    try 
        if (mDeviceManager != null) 
            CameraCharacteristics characteristics = mDeviceManager.getCameraManager().getCameraCharacteristics(String.valueOf(cameraIndex));

            return characteristics.get(CameraCharacteristics.LENS_FACING)
                    == CameraCharacteristics.LENS_FACING_FRONT;
        
     catch (CameraAccessException e) 
        e.printStackTrace();
     catch (NullPointerException e) 
        e.printStackTrace();
    

    return false;


  boolean mirror = isFrontCamera(Integer.parseInt(mCameraId));
                if (mirror) 
                    //Mirror image rotation is equal to the negative rotation of the device, but some external apps are not able to read negative numbers
                    //in image details, we do this to prevent the crash of this apps
                    rotation = 360 - rotation;
                    if (rotation == 360) 
                        rotation = 0;
                    
                

稍后您必须在将图像添加到视图之前对其进行旋转,您可以使用这样的矩阵:

 public static Bitmap rotateImage(Bitmap imageToOrient, int degreesToRotate) 
    Bitmap result = imageToOrient;
    try 
        if (degreesToRotate != 0) 
            Matrix matrix = new Matrix();
            matrix.setRotate(degreesToRotate);
            result = Bitmap.createBitmap(
                    imageToOrient,
                    0,
                    0,
                    imageToOrient.getWidth(),
                    imageToOrient.getHeight(),
                    matrix,
                    true);
        
     catch (Exception e) 
        if (Log.isLoggable(TAG, Log.ERROR)) 
            Log.e(TAG, "Exception when trying to orient image", e);
        
    
    return result;

我知道您没有使用位图,但您可以修改方法以向其发送 byteArray 或您需要的任何内容。

希望对你有所帮助! 最好的问候!

【讨论】:

以上是关于用前置摄像头拍摄的照片颠倒了的主要内容,如果未能解决你的问题,请参考以下文章

IOS Swift 3:拍摄相机图片后水平翻转前置摄像头图像

Android翻盖前置摄像头镜头翻转视频

如何使前置摄像头拍摄的视频不是逆安卓?

Android:如何旋转或更改使用库录制的视频的方向?

使用前置摄像头时需要镜像视频方向和手柄旋转

相机预览很好,但前置摄像头会产生非常暗的照片