使用 Android Camera API,拍摄照片的方向始终未定义 [英] Using Android Camera API, snapped photo's orientation is always Undefined

查看:33
本文介绍了使用 Android Camera API,拍摄照片的方向始终未定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I use the camera api and the photo taken is always rotated by 90 degree, and i would like to rotate it.

所以首先我想知道图片的方向,这一点我卡住了.我总是在这两个方面都得到不确定的方向.

So first of all i would like to know the picture's orientation and this point im stuck. I always getting UNDEFINDED orientation in both ways.

代码如下:

    @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/内存,只需旋转图像.

I have been decoding/observing Android JPEG images since early 2011 because I published an image viewing application. In the 'early' days, the images were encoded in the sensor's native orientation and the actual orientation of the device was written into the EXIF metadata. Starting about 2 years ago, I noticed that the orientation was no longer being written into the EXIF data and instead, the camera app was rotating the image pixels before encoding the JPEG files. My guess is that this occurred because some photo viewers (* cough * Windows * cough *) ignore the EXIF orientation when displaying JPEG files and instead of waiting for Microsoft to fix it and blaming Android for doing something wrong, they decided to make use of the faster CPU/memory and just rotate the image.

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

The result is that without knowing the EXIF orientation, one can only determine that a photo was captured in landscape or portrait orientation. This bit of info is only an assumption because the majority of camera sensors are wider than they are tall.

这篇关于使用 Android Camera API,拍摄照片的方向始终未定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆