我创建了一个自定义相机。当我单击应用程序中的捕获按钮时,图像已被拍摄。此外,我在名为onPictureTaken的函数中以字节数组的形式获取数据。
我正在使用称为Glide的库将字节数组转换为位图。
我的问题是在三星设备中图像会自行旋转。我已经研究了很长时间。我找到了一个名为元数据提取库的库,用于从 byte[] 获取 Exif 信息并在其上旋转图像,但它不适用于三星设备。元数据提取库每次都会返回一个值为 1 的肖像图像,这表明图像不需要旋转,但是在肖像模式下拍摄的图像总是旋转 90 度。
每当以纵向模式拍摄照片时,前后摄像头都会旋转 90 度角,元提取库显示值为 1。
除了元数据提取提取库之外,还有其他东西可以提取 Exif 信息流数据吗?
注意: 我不能使用 ExifInterface,因为它需要 24 的最低 API 级别,而我正在测试 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 进行测试。