捕获的图像旋转90度

时间:2013-04-05 11:29:05

标签: android

我写了一个应用程序来捕捉图像。问题是图像在捕获后旋转了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服务,我需要将此热修复应用于每个外部系统。我该如何纠正这种旋转?

谢谢!

2 个答案:

答案 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图片或录制的视频

因此,如果您想保存旋转的图像,则需要在保存前自行旋转。