0

我编写了一个应用程序来捕获图像。问题是图像在捕获后旋转了 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 度。我当然可以旋转ImageView90 度,但由于我将使用其他系统,例如自制的 Web 服务,我需要将此热修复应用到每个外部系统。我怎样才能纠正这种旋转?

谢谢!

4

2 回答 2

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);
于 2013-04-05T11:40:40.737 回答
-1

顾名思义setDisplayOrientation(),仅供展示医生说

这不影响onPreviewFrame(byte[], Camera)、JPEG图片或录制视频传入的字节数组的顺序

所以如果你想保存旋转的图像,你需要在保存之前自己旋转它。

于 2013-04-05T11:32:25.993 回答