我写了一个应用程序来捕捉图像。问题是图像在捕获后旋转了90度。我已经设定了
camera.setDisplayOrientation(NINTY_DEGREES);
但这仅影响SurfaceView
的预览。真正的问题是我从相机获得的字节被翻转。为什么会这样?是否有我可以设置的设置在捕获之前将其翻转?
我的活动在拍摄图像时会记录一个事件。这是我在填充byte[]
时注册的方式:
camera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
if (null != callback)
callback.onJpegPictureTaken(data, camera);
}
});
在我的Activity
public class History extends BaseWindow implements OnClickListener, CaptureImageCallback
及相关方法:
@Override
public void onJpegPictureTaken(byte[] data, Camera camera) {
Intent i = new Intent(this, ImageEditing.class);
i.putExtra("image", data);
startActivity(i);
}
您可以看到包含图像数据的参数data
,此字节数组旋转90度。我当然可以旋转ImageView
90度,但由于我将使用其他系统,例如自制的Web服务,我需要将此热修复应用于每个外部系统。我该如何纠正这种旋转?
谢谢!
答案 0 :(得分:0)
您可以获取捕捉图像的“角度”并按角度旋转。
ExifInterface exif = new ExifInterface(imagePath);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);
int angle = 0;
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
angle = 90;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
angle = 180;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
angle = 270;
}
Log.d("Tag", "Angle: " + angle);
Matrix mat = new Matrix();
mat.postRotate(angle);
if (angle != 0)
Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), mat, true);
答案 1 :(得分:-1)
名称表示setDisplayOrientation()
仅适用于显示。 Doc says:
这不会影响传入的字节数组的顺序 onPreviewFrame(byte [],Camera),JPEG图片或录制的视频
因此,如果您想保存旋转的图像,则需要在保存前自行旋转。