用前置摄像头拍摄的照片颠倒了
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 或您需要的任何内容。
希望对你有所帮助! 最好的问候!
【讨论】:
以上是关于用前置摄像头拍摄的照片颠倒了的主要内容,如果未能解决你的问题,请参考以下文章