为什么使用Surface视图的相机图像与使用Intent捕获的图像不同(ACTION_IMAGE_CAPTURE)

时间:2012-05-18 03:58:48

标签: java android

我使用以下代码捕获图像。在其中我使用Surfaceview。捕获的图像保存在我在Android Sdcard中创建的文件夹中,但是当我在GridView中显示这些图像时,图像方向是不同的。如果我使用Intent (ACTION_IMAGE_CAPTURE)使用相机,则输出图像定义良好。任何人都可以帮助我

这里我有一个类,它扩展了一个工具SurfaceHolder.Callback

public class CameraView extends Activity implements SurfaceHolder.Callback {

       private static final String TAG = "CameraVeiw";

        private Camera camera;
        boolean previewing = false;
        SurfaceHolder surfaceHolder;
        private File file = null;
        private static String mFileName = null;

        private long name;

        final int RESULT_SAVEIMAGE = 0;
        private int w;
        private int h;

        public   static byte[] data = null;

        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.camera);
       }

我使用SurfaceView来捕捉图像

    SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
    surfaceHolder = surfaceView.getHolder();
    surfaceView.getWindowVisibility();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    surfaceHolder.setFixedSize(300, 300); //hard coded

    Button button2 = (Button) findViewById(R.id.picbutton);
    button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {



    camera.takePicture(new CustomShutter(), null, 
    new CustomPictureCallback());
    }
    });

    }
public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {

        if(previewing){
            camera.stopPreview();
            previewing = false;
        }

        if (camera != null){
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();


                previewing = true;


            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
             camera.setDisplayOrientation(90);        }

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;  
}

class CustomPictureCallback implements Camera.PictureCallback {
    private Bitmap bitmap;
public void onPictureTaken(byte[] data, Camera camera) {

             FileOutputStream outStream = null;

                try {

        String path = "/sdcard/MonsterApp/Photos/" + data+".jpg";
                outStream = new FileOutputStream(String.format(path));
                    outStream.write(data);
                    outStream.close();
                    Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                }
                Log.d(TAG, "onPictureTaken - jpeg");

                camera.startPreview();
                Log.i("Information", "Helllllooooo");   } }




class CustomShutter implements Camera.ShutterCallback {


    public void onShutter() {

    }

    }
    @Override
    public void onDestroy() {
    super.onDestroy();
    if(camera != null) {
    camera.release();
    }
    }

}

2 个答案:

答案 0 :(得分:0)

我认为当你使用Intent(ACTION_IMAGE_CAPTURE)时它会使用永远不会处理设备方向的默认应用程序。该设备始终仅处于横向状态。但是,如果在旋转设备时进行表面视图,则会处理方向。所以它也会旋转相机捕捉。我认为最佳解决方案是将您的相机捕捉活动固定为景观并在景观中设置正确的方向。我想那时你的相机会正常工作。如果你还不明白那么我可以发一些代码给你..但首先尝试..我不确定,但我认为它应该有效。

你可以尝试一次吗

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

使用表面视图在创建然后捕获中写下此内容。

尝试设置正确的方向

mCamera.setDisplayOrientation(90);

mCamera.setDisplayOrientation(0);

有四种不同的角度,一定会与您的代码一起使用。尝试每一个..

答案 1 :(得分:0)

有一个元数据,包含从Android相机捕获的所有图像。我认为在使用曲面视图捕获时,您不会使用图像保存EXIF元数据。 EXIF元数据包含拍摄图像时手机的方向详细信息。所以android系统在显示时根据方向细节旋转图像。这些细节可能对您有所帮助

http://mobisocial.stanford.edu/news/2011/08/rotating-images-in-android/