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

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

这是代码:

    @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

可能是什么问题呢?

#1楼 票数:9 已采纳

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

结果是,在不知道EXIF方向的情况下,人们只能确定以横向或纵向方向捕获照片。 这一点信息只是一个假设,因为大多数相机传感器比它们更高。

#2楼 票数:0

在这段代码中

outputStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);  // Add this line
outputStream.flush();
outputStream.close(); // do not forget to close the stream

您忘记将字节实际写入输出流。 因此,文件长度为0,自然不包含任何EXIF信息。

在调用decodeByteArray然后再将其保存时也要小心,这也会丢失EXIF信息! 您需要从原始图像字节解析EXIF。

  ask by Adam Varhegyi translate from so

未解决问题?本站智能推荐:

1回复

如何检测设备旋转以设置EXIF方向标签(Android)

在我的相机应用中,UI方向固定为纵向。 通过设置camera.setdisplayorientation(90),预览可以在横向和纵向上正确显示。 我可以拍照并将其保存到文件中。 当我通过ImageView显示它时,以横向拍摄的照片可以正确显示。 (手机左侧) 但是...以
2回复

Android将图像保存到图库的方向不正确

Android将图像保存到图库的方向不正确int getOrientationFromExif()之后获得的值始终是相同的:1 ...不知道如何解决...。请帮助我! 你能帮我解决吗? 问题出在里面
3回复

Exif数据TAG_ORIENTATION始终为0

我需要知道图库中图像的方向(由相机拍摄)。 我最初的方法是使用适用于Droid 1的MediaStore.Images.Media.ORIENTATION。在HTC Thunderbolt上进行测试时,该电话仅将0保存到该字段。 然后,我开始阅读exif数据: 每个图像也返回0。
3回复

如何在Android中设置相机方向?

我已经看过其他人问过的其他问题,但是我不确定解决此问题的最佳方法是什么。 阅读完Android指南以实现相机后,我拥有的相机预览被锁定为横向。 我想知道如何调整相机的方向以反映手机的方向。 我试过了 并将相机锁定为纵向模式,因此我需要另一种解决方案(最好是适用于大多数设备的解决
2回复

设置Android Photo EXIF方向

我编写了一个以编程方式捕获照片的Android活动。 我想将图像保存为具有正确EXIF方向数据的JPEG(就像原生Android Camera应用程序自动执行一样)。 这是实际拍摄照片的方法(我删除了try / catch块): ...和回调: 照片拍摄得当,但我的问题是
1回复

如果我将活动的方向限制为仅在清单中为人像,我能否获得在我的应用中拍摄的照片的方向?

我不想在我的应用程序中完全支持横向UI,但是我希望能够自动旋转用户在横向模式下拍摄的照片。 当前,如果用户以横向模式拍摄照片,则它会像照人像一样保留在屏幕上(照片的水平是垂直的)。 我试图从这样的系统中获取方向: 但是它不起作用,每次都返回0。 我尝试了其他一些解决方案,但
3回复

从Android相机旋转图片

我正在为相机设置旋转: 当设备处于水平方向时拍摄照片。 我需要将照片旋转到垂直方向。 但是,当我保存jpeg时,它永远不会旋转,它始终是水平的。 我想念什么吗? 我认为拍摄后不应该手动旋转图片。 我认为相机应该能够为我做到这一点。 setRotation参数无关紧要
1回复

Android前置摄像头图像被上下颠倒保存

我正在构建一个使用相机功能的android应用程序。 我遇到的问题是从前置摄像头获得的图像数据(byte [])在三星s7和Nexus手机上倒置。 它在预览中看起来是正确的,但是在我按原样保存数据并在图库中显示图像之后,它们全部颠倒了。 我知道我可以在保存之前翻转图像数据,但是我已经在运行