【问题标题】:How to rotate android device camera preview(libgdx)如何旋转android设备相机预览(libgdx)
【发布时间】:2014-03-02 06:00:57
【问题描述】:

我正在使用 libgdx 来制作应用程序,并且我需要使用相机,所以我按照 this 教程进行操作,并且我的所有相机源都旋转了 90 度,但它们被绘制得好像不是一样。不幸的是,这意味着预览完全失真并且很难使用。

除非要求 sn-ps,否则我不会在这里发布我的代码,因为我将教程中的代码复制粘贴到我的游戏中。我记得所做的唯一更改如下。

我更改了CameraSurace.java中原来的surfaceCreated()方法

 public void surfaceCreated( SurfaceHolder holder ) {
    // Once the surface is created, simply open a handle to the camera hardware.
    camera = Camera.open();
}

打开前置摄像头(我使用的是只有前置摄像头的 Nexus 7...)

    public void surfaceCreated( SurfaceHolder holder ) {
    // Once the surface is created, simply open a handle to the camera hardware.
    camera = openFrontFacingCamera();
}


@SuppressLint("NewApi")
private Camera openFrontFacingCamera() 
{
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
        Camera.getCameraInfo( camIdx, cameraInfo );
        if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT  ) {
            try {
                cam = Camera.open( camIdx );
            } catch (RuntimeException e) {
                System.out.println("Falied to open.");
            }
        }
    }

    return cam;
}

除此之外,其余代码几乎完全相同(不包括细微的变量更改等。)

【问题讨论】:

    标签: java android camera libgdx


    【解决方案1】:

    您可以使用ExifInterface 类来确定与您的图像关联的ORIENTATION_TAG 并相应地旋转图像。

    代码如下所示:

    ei = new ExifInterface(imagePath); orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: imageView.setRotation(90); break; ... default: break; }

    【讨论】:

    • 通过说'imagePath'我假设你的意思是保存的图像?图像直到最后才保存,对于我正在做的事情,拍摄照片时的方向无关紧要,只是在显示预览时
    • @Duck 对不起队友.. 误解了你的问题!
    • 别担心,这一切都很好,也许有一天会派上用场,谁知道呢:)
    【解决方案2】:

    在深入研究相机 API 后,我发现我所要做的就是使用一个名为 setDisplayOrientation(90) 的漂亮小方法,它现在可以完美运行。

    修改代码:

        @SuppressLint("NewApi")
    public void surfaceCreated( SurfaceHolder holder ) {
        // Once the surface is created, simply open a handle to the camera hardware.
        camera = openFrontFacingCamera();
        camera.setDisplayOrientation(90);
    }
    
    
    @SuppressLint("NewApi")
    private Camera openFrontFacingCamera() 
    {
        int cameraCount = 0;
        Camera cam = null;
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        cameraCount = Camera.getNumberOfCameras();
        for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
            Camera.getCameraInfo( camIdx, cameraInfo );
            if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT  ) {
                try {
                    cam = Camera.open( camIdx );
                } catch (RuntimeException e) {
                    System.out.println("Falied to open.");
                }
            }
        }
    
        return cam;
    }
    

    P.S 我忽略NewApi 的唯一原因是因为我知道该应用程序将在哪个设备上运行,并且它特定于该设备...除非您知道设备的 API 很高,否则不推荐够了……(它只需要 API 8)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 2013-05-06
      • 2012-11-09
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多