【发布时间】:2018-05-26 11:40:19
【问题描述】:
我创建了一个自定义相机。当我单击应用程序中的捕获按钮时,图像已被拍摄。此外,我在名为 onPictureTaken 的函数中以字节数组的形式获取数据。
我正在使用名为 Glide 的库将字节数组转换为位图。
我的问题是在三星设备中图像会自行旋转。我已经研究了很长时间。我找到了一个名为元数据提取库的库,用于从 byte[] 获取 Exif 信息并在其上旋转图像,但它不适用于三星设备。 元数据提取库每次都会返回一个值为 1 的肖像图像,这表明图像不需要旋转,但在肖像模式下拍摄的图像总是旋转 90 度。
每当以纵向模式拍摄照片时,前后摄像头都会旋转 90 度角,元提取库显示的值为 1。
除了元数据提取提取库之外,还有其他提取Exif信息流数据的东西吗?
注意: 我不能使用 ExifInterface,因为它要求最低 Api 级别为 24,而我正在测试 API 级别 22
我尝试了很多解决方案,但没有任何效果。有什么解决办法吗?
代码如下:
public void onPictureTaken(byte[] data, Camera camera) {
mCamera.stopPreview();
Glide.with(this).load(data)
.asBitmap().centerCrop().animate(R.anim.abc_fade_in)
.into(new SimpleTarget<Bitmap>(width, height) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
camera_view.setVisibility(View.INVISIBLE);
int w = resource.getWidth();
int h = resource.getHeight();
// Setting post rotate to 90
Matrix mtx = new Matrix();
try {
InputStream is = new ByteArrayInputStream(data);
Metadata metadata = ImageMetadataReader.readMetadata(is);
final ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
final int exifOrientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
switch (exifOrientation) {
case 6:
mtx.postRotate(90);
break; // top left
case 3:
mtx.postRotate(180);;
break; // top right
case 8:
mtx.postRotate(270);
break; // bottom right
}
photo = Bitmap.createBitmap(resource, 0, 0, w, h, mtx, true);
/* Work on exifOrientation */
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
我正在使用三星 J5 进行测试。
【问题讨论】:
-
从我所看到的实际问题是
ExifIFD0Directory实际上并不存在于来自三星设备的元数据中。但是,我目前正在使用一个 Cordova 插件,该插件能够修复来自三星设备的图像的方向。以下是源链接:github.com/apache/cordova-plugin-camera/blob/master/src/android/…
标签: android image android-glide metadata-extractor