背景:我正在为一个即时通讯程序编写相机应用,但不能随时将拍摄的图像保存到持久磁盘。相机必须支持所有方向。我的实现方式是使用常见的Surfaceview示例,使用Display类来检测方向并旋转相机。在takePicture jpeg回调中,我从byte[]构造位图以解决一些纵横比问题:Camera API: Cross device issues
问题描述:在某些设备上,采用ROTATION_270(设备顺时针旋转90度)拍摄的构造位图上下颠倒了。到目前为止,似乎只有三星存在这种情况。我只能认为,可能相机焊接方式与其他设备不同,但这不是重点。虽然我可以检查位图是否侧着拍摄,但无法通过尺寸逻辑上检查是否上下颠倒,因此我需要访问EXIF数据。
Android提供了一个解析器http://developer.android.com/reference/android/media/ExifInterface.html,但不幸的是它只有一个接受文件的构造函数,而我没有也不想要一个文件。直觉上,我可以为一个字节数组编写构造函数,但由于它们调用本地代码,这似乎非常麻烦。http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2.1_r1/android/media/ExifInterface.java
我的问题有两个部分:
是否有人知道byte[]数组是否包含完整的EXIF jpeg头数据,还是通过BitmapFactory.decode(...) / BitmapFactory.compress(...)添加了一些内容?
如果这个EXIF数据存在于字节数组中,如何以一种可靠的方式解析方向信息?
编辑 10/18/12
pcans的答案涉及到我问题的第二部分。如我在他的回答下面的评论中指出,如果要使用该解析器,您将需要将源代码合并到您的项目中。那篇SO帖子中提到的更改已经被进行了,并在此处重新发布:https://github.com/strangecargo/metadata-extractor
注意:较新版本的metadata-extractor可直接在Android上使用,无需修改,并可通过Maven获得。
然而,在第一部分中,当我用从takePicture获取的字节数组运行它时,解析器返回0个标记。我开始担心字节数组中没有我需要的数据。我将继续研究这个问题,但欢迎任何进一步的见解。