且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何旋转和翻转的位图中onPictureTaken

更新时间:2023-11-10 10:20:34

我已经投入了大量的工作,这个和思想,我想分享我的解决方案。 这是对摩托罗拉Devy,三星Xcover 1和三星XCover 2测试。

I have put a lot of work into this and thought, I'd share my solution. It is tested on a Motorola Devy, Samsung Xcover 1 and Samsung XCover 2.

当我和一个自定义的摄像头preVIEW工作,该解决方案主要有两个 部分。 1.小心的摄像头preVIEW和的preVIEW设置旋转根据 到设备的旋转。 2.一旦拍摄照片时,那就是onPictureTaken'回调函数 旋转图片以正确的角度,这样它显示了在preVIEW刚 显示。

As I work with a custom camera preview, the solution basically has two parts. 1. Take care of the camera preview and set rotation of the preview according to device rotation. 2. Once a picture is taken, that is the 'onPictureTaken' callback is invoked rotate the picture by the correct angle, such that it shows what the preview just showed.

private void initPreview(int width, int height) {
    if (camera != null && holder.getSurface() != null) {
        try {
            camera.setPreviewDisplay(holder);
        } catch (Throwable t) {
            Log.e("PreviewDemo-surfaceCallback",
              "Exception in setPreviewDisplay()", t);
            Toast.makeText(getContext(), t.getMessage(),
                       Toast.LENGTH_LONG).show();
        }

        try {
            Camera.Parameters parameters=camera.getParameters();

            Camera.Size size=getBestPreviewSize(width, height, parameters);
            Camera.Size pictureSize=getSmallestPictureSize(parameters);

            Display display = windowManager.getDefaultDisplay();
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { // for 2.1 and before
                if (isPortrait(display)) {
                    parameters.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_PORTRAIT);
                } else {
                    parameters.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_LANDSCAPE);
                }
            } else { // for 2.2 and later
                switch (display.getRotation()) {
                    case Surface.ROTATION_0: // This is display orientation
                        if (size.height > size.width) parameters.setPreviewSize(size.height, size.width);
                        else parameters.setPreviewSize(size.width, size.height);
                        camera.setDisplayOrientation(90);
                        break;
                    case Surface.ROTATION_90:
                        if (size.height > size.width) parameters.setPreviewSize(size.height, size.width);
                        else parameters.setPreviewSize(size.width, size.height);
                        camera.setDisplayOrientation(0);
                        break;
                    case Surface.ROTATION_180:
                        if (size.height > size.width) parameters.setPreviewSize(size.height, size.width);
                        else parameters.setPreviewSize(size.width, size.height);
                        camera.setDisplayOrientation(270);
                        break;
                    case Surface.ROTATION_270:
                        if (size.height > size.width) parameters.setPreviewSize(size.height, size.width);
                        else parameters.setPreviewSize(size.width, size.height);
                        camera.setDisplayOrientation(180);
                        break;
                }
            }

            parameters.setPictureSize(pictureSize.width, pictureSize.height);
            //parameters.setPictureFormat(ImageFormat.JPEG);
            camera.setParameters(parameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


您'surfaceChanged的方法,在你的相机preVIEW(SurfaceView) 你应该是这样的:


Your 'surfaceChanged' method, in your camera preview (SurfaceView), you should look like this:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    stopPreview();
    initPreview(w, h);
    startPreview();
}


其中


where

停止preVIEW:

private void stopPreview() {
    if (camera != null) {
        camera.stopPreview();
    }
}

开始preVIEW:

startPreview:

private void startPreview() {
    if (camera != null) {
        camera.startPreview();
    }
}

2


在您的onPictureTaken回调旋转图片,使用下面的code:

2


In your 'onPictureTaken' callback rotate the picture, using the following code:

Display display = getWindowManager().getDefaultDisplay();
int rotation = 0;
switch (display.getRotation()) {
    case Surface.ROTATION_0: // This is display orientation
    rotation = 90;
    break;
case Surface.ROTATION_90:
    rotation = 0;
    break;
case Surface.ROTATION_180:
    rotation = 270;
    break;
case Surface.ROTATION_270:
    rotation = 180;
        break;
 }

 Bitmap bitmap = ImageTools.toBitmap(data);
 bitmap = ImageTools.rotate(bitmap, rotation);


其中


where

ImageTools.toBitmap =

ImageTools.toBitmap =

public static Bitmap toBitmap(byte[] data) {
    return BitmapFactory.decodeByteArray(data , 0, data.length);
}


ImageTools.rotate =


ImageTools.rotate =

public static Bitmap rotate(Bitmap in, int angle) {
    Matrix mat = new Matrix();
    mat.postRotate(angle);
    return Bitmap.createBitmap(in, 0, 0, in.getWidth(), in.getHeight(), mat, true);
}