gpt4 book ai didi

android - 使用 Android Camera API,快照照片的方向始终未定义

转载 作者:太空狗 更新时间:2023-10-29 15:45:56 25 4
gpt4 key购买 nike

我使用相机 api,拍摄的照片总是旋转 90 度,我想旋转它。

所以首先我想知道图片的方向,我卡住了这一点。我总是在这两种方式中得到 UNDEFINDED orientation。

代码如下:

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


//Bitmap Options for lowering quality the bitmap to save memory
Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
options.inPreferredConfig = Bitmap.Config.RGB_565;

//Make the bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);

//Making the path, the root will be fine for tests
String path = Environment.getExternalStorageDirectory().toString();

//output stream
OutputStream outputStream = null;
//Making the file as a jpg
File file = new File(path, "tmp_pic" + ".jpg"); // the File to save to
try {

//Writing the file
outputStream = new FileOutputStream(file);
outputStream.flush();
outputStream.close(); // do not forget to close the stream


//Getting the orientation in both possible ways
int ori = getOrientationFromExif(file.getPath());
int ori2 = getOrientationFromUri(Uri.fromFile(file));
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
if (bitmap == null) {
Toast.makeText(getApplicationContext(), "Error: Cant make photo.", Toast.LENGTH_SHORT).show();
}
else {
PhotoTapView.photoViews.get(index).setPhotoImage(bitmap);
finish();
}
cameraObject.release();
}

方向函数:

    //Getting orientation from file URI
private int getOrientationFromUri(Uri imageUri) {
String[] orientationColumn = { MediaStore.Images.Media.ORIENTATION };
Cursor cur = getContentResolver().query(imageUri, orientationColumn, null, null, null);
int orientation = -1;
if (cur != null && cur.moveToFirst()) {
orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
}
Log.i("Orientation from Uri", orientation + "");
return orientation;
}

//Getting orientation from ExifInterface
private static int getOrientationFromExif(String imagePath) {
int orientation = -1;
try {
ExifInterface exif = new ExifInterface(imagePath);
int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
Log.i("Orientation from Exif: ", exifOrientation + "");
switch (exifOrientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
orientation = 270;
Log.i("Orientation from Exif", "270");
break;
case ExifInterface.ORIENTATION_ROTATE_180:
orientation = 180;
Log.i("Orientation from Exif", "180");
break;
case ExifInterface.ORIENTATION_ROTATE_90:
Log.i("Orientation from Exif", "90");
orientation = 90;
break;
case ExifInterface.ORIENTATION_NORMAL:
orientation = 0;
Log.i("Orientation from Exif", "0 - Normal");
break;
case ExifInterface.ORIENTATION_UNDEFINED:
orientation = -1;
Log.e("Orientation from Exif", "UNDEFINED");
}
}
catch (IOException e) {}
return orientation;
}

日志输出:

01-14 19:46:09.468: E/Orientation from Exif(12411): UNDEFINED
01-14 19:46:09.468: I/Orientation from Uri(12411): -1

可能是什么问题?

最佳答案

自 2011 年初以来,我一直在解码/观察 Android JPEG 图像,因为我发布了一个图像查看应用程序。在“早期”,图像以传感器的原始方向编码,设备的实际方向被写入 EXIF 元数据。大约从 2 年前开始,我注意到方向不再写入 EXIF 数据,取而代之的是,相机应用程序在编码 JPEG 文件之前旋转图像像素。我的猜测是,这是因为一些照片查看器(*咳* Windows *咳*)在显示 JPEG 文件时忽略了 EXIF 方向,而不是等待微软修复它并指责 Android 做错了,他们决定利用更快的 CPU/内存,只需旋转图像。

结果是,在不知道 EXIF 方向的情况下,只能确定照片是以横向还是纵向拍摄的。这条信息只是一个假设,因为大多数相机传感器的宽度大于高度。

关于android - 使用 Android Camera API,快照照片的方向始终未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27950755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com