0

次のコードを使用して画像をキャプチャします。その中で私は使用しますSurfaceview。キャプチャした画像は、Android Sdcard で作成したフォルダーに保存されますが、これらの画像を画像の向きで表示するGridViewと、画像の向きが異なります。カメラを使用するとIntent (ACTION_IMAGE_CAPTURE)、出力画像が明確に定義されます。誰でも私を助けることができます

ここに Activity を実装するクラスがあります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();
    }
    }

}
4

2 に答える 2

0

Intent (ACTION_IMAGE_CAPTURE) を使用すると、デバイスの向きを処理しないデフォルトのアプリケーションが使用されると思います。デバイスは常に横向きのままです。ただし、表面ビューの場合、デバイスを回転させると向きが処理されます。そのため、カメラ キャプチャも回転します。最善の解決策は、カメラのキャプチャ アクティビティを横向きに修正し、適切な向きを横向きに設定することだと思います。私はあなたのカメラがうまく動作すると思います。理解していない場合は、コードを投稿できます..しかし、最初に試してください..よくわかりませんが、うまくいくはずです。

これを一度試してみませんか

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

これを作成時に書き込み、表面ビューを使用してキャプチャします。

これを試して適切な向きを設定してください

mCamera.setDisplayOrientation(90);

また

mCamera.setDisplayOrientation(0);

コードで確実に機能する 4 つの異なる角度があります。それらのそれぞれを試してみてください..

于 2012-05-18T04:15:58.127 に答える
0

Android カメラからキャプチャされたすべての画像を含むメタデータがあります。表面ビューでキャプチャするときに、EXIF メタデータを画像と共に保存していないと思います。EXIF メタデータには、画像を撮影する際の携帯電話の向きの詳細が含まれています。したがって、Android システムは、表示中に方向の詳細に従って画像を回転させます。この詳細はあなたを助けるかもしれません

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

于 2012-05-18T04:16:48.973 に答える