Jos*_*a W 9 camera android exif android-camera android-orientation
我编写了一个以编程方式捕获照片的Android活动.我想将图像保存为具有正确EXIF方向数据的JPEG(就像原生Android Camera应用程序自动执行一样).
这是实际拍摄照片的方法(我删除了try/catch块):
private void takePhoto() {
camera = Camera.open();
SurfaceTexture dummySurfaceTexture = new SurfaceTexture(0);
camera.setPreviewTexture(dummySurfaceTexture);
camera.startPreview();
camera.takePicture(null, null, jpgCallback);
}
Run Code Online (Sandbox Code Playgroud)
...和回调:
private Camera.PictureCallback jpgCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
releaseCamera();
savePhoto(data);
};
Run Code Online (Sandbox Code Playgroud)
照片拍摄得当,但我的问题是EXIF数据显示方向设置为"图像方向:顶部,左手",无论设备的方向如何,因此当我上传照片时,它会显示为颠倒或旋转.
我是否真的需要手动捕捉设备方向(滚动,俯仰,方位角)并自己编写EXIF方向?Camera应用程序如何自动正确地写入此数据?有谁知道正确设置此属性的方法?
编辑:我无法使用屏幕方向,因为活动被锁定为纵向模式.
Edd*_*ala 15
您不必自己编写EXIF方向,但在拍照之前,您需要告知相机子系统您的设备方向.它无法自行访问该信息.设置后,相机子系统将设置EXIF字段或旋转图像数据以正确定向图像(这取决于您的特定设备).
要告诉相机您想要静止图片的方向,请使用Camera.Parameters.setRotation():
开发人员文档中有关于如何正确使用它的参考代码,这有点棘手,因为您设置的值取决于1)相机传感器的方向和2)UI的方向,相对于设备的正常方向.我在这里复制了示例代码,它使用了OrientationEventListener并假设您有一个名为mParameters的Camera.Parameters对象:
public void onOrientationChanged(int orientation) {
if (orientation == ORIENTATION_UNKNOWN) return;
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, 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;
}
mParameters.setRotation(rotation);
}
Run Code Online (Sandbox Code Playgroud)
然后在takePicture调用之前,需要调用Camera.setParameters(mParameters).
在您的特定情况下,您可能希望在拍摄照片之前查询方向,并使用示例代码中的逻辑来计算旋转.然后使用Camera.getParameters()获取相机参数,调用setRotation,然后调用Camera.setParameters().
小智 -3
ExifInterface exif;
try {
exif = new ExifInterface(filePath);
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, 0);
Log.d("EXIF", "Exif: " + orientation);
Matrix matrix = new Matrix();
if (orientation == 6) {
matrix.postRotate(90);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 3) {
matrix.postRotate(180);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 8) {
matrix.postRotate(270);
Log.d("EXIF", "Exif: " + orientation);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8602 次 |
| 最近记录: |