繁体   English   中英

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

Using Android Camera API, snapped photo's orientation is always Undefined

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我使用相机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

可能是什么问题呢?

2 个回复

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

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

在这段代码中

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。

1 快照始终未定义

因此,我尝试使用Firebase云消息传递将推送通知发送到我的应用程序。 但是,由于某些奇怪的原因,它似乎连续失败。 我正在使用onCreate方法来侦听某个路径下节点的创建。 它正在从收集在onCreate方法中的信息中获取UID ,但是当我尝试从其他节点获取用户信息以获取fcmToke ...

4 在 android 版本 10 中使用 camera2 api 捕获时出现图像方向问题

我已将我的相机功能从 Camera 更新为 camera2 api。 当我用前置摄像头捕获图像并将其显示在 imageview 中时。 图像的方向发生了变化。 然后我用这个代码来改变图像的方向。 上面的代码适用于我测试过的 android 版本(即版本 5,9)。 当我在 Android 版本 ...

9 为什么当被jQuery访问时,Flickr公共提要API在显示照片结果之前返回“未定义”?

我最近开始使用API​​ / Ajax / JSON,并开始了一个小项目来测试我的知识。 我做了一个简单的网站,您在其中输入一个单词到表格中,它带回与该单词相关的Flickr照片。 它的效果很好,但是在第一张照片之前总是包含一个简单的“ undefined”,与第一行图片的显示混乱。 ...

10 未定义 Google 照片 API 身份验证会话

我目前正在为谷歌照片 API 编写客户端。 我使用邮递员功能“获取新的访问令牌”创建了一个 oauth2 密钥,该密钥工作正常。 我有我在 c# 代码中使用的访问令牌。 即使我使用正确的标题发帖,我也会不断收到以下消息。 { "code": 16, "message": "未定义身份验证会话。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM