Android camera垂直撮影垂直方向写真を取得してズーム処理する


必要に応じて、プレビュー時の縦と写真を撮って縦方向の写真を得るのが一般的です
状況一、写真撮影時の縦プレビュー:
実現原理①:写真撮影のActivityを横画面にする
実装①: AndroidManifest.xml対応activity android:screenOrientation="landscape"を追加
デメリット:Activityを横画面に設定すると、上のボタンなども回転します.
実現原理②:プレビュー効果を縦方向に設定
実装②:Cameraオブジェクトの初期化後、Cameraオブジェクトを垂直プレビューとして設定
コード:
private void setDisplayOrientation(){
	int rotation = getWindowManager()
	           .getDefaultDisplay().getRotation();
	int degree = 0;
	switch (rotation) {
	case Surface.ROTATION_0:	degree = 0; break;
	case Surface.ROTATION_90:	degree = 90; break;
	case Surface.ROTATION_180:	degree = 180; break;
	case Surface.ROTATION_270:	degree = 270; break;
	}
	int result;
	CameraInfo info = new CameraInfo();
	Camera.getCameraInfo(0, info);
	if(info.facing == CameraInfo.CAMERA_FACING_FRONT){
		result = (info.orientation + degree) % 360;
		result = (360 - result) % 360;
	}else{
		result =(info.orientation - degree + 360 ) % 360;
	}
	myCamera.setDisplayOrientation(result);
	//   myCamera        Camera  
}

状況二、縦方向の写真を得る:
実現原理:写真コールバック関数で得られたByte[]配列をBitMapオブジェクトに変換し、BitMapオブジェクトを回転処理する
実装:ソースを貼り付けましょう
@Override
public void onPictureTaken(byte[] data, Camera camera) {
	//        270°  (          ),    
	Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
	Matrix matrix = new Matrix();
	matrix.preRotate(270);
	bitmap = Bitmap.createBitmap(bitmap ,0,0, bitmap .getWidth(), bitmap .getHeight(),matrix,true);
};

画像の幅を変更する必要がある場合は、次の手順に従います.
携帯電話で撮った写真の長さと幅にはデフォルト値があることはよく知られています(私の携帯電話の640*480です)、ユーザーが長さと幅の割合を変更する必要がある場合は、MatrixオブジェクトのpostScaleメソッドで長さと幅の割合を再設定する必要があります.次に、このMatrixオブジェクトを使用してBitmapオブジェクトを再作成します.
コード(前のコードに内容を追加すればいい):
@Override
public void onPictureTaken(byte[] data, Camera camera) {
	//       Activity
	CameraActivity.this.finish();
	
	//             (         ),    
	Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
	Matrix matrix = new Matrix();
	
	int width = bitmap.getWidth();
	int height = bitmap.getHeight();
	
	//         (       640 * 480)
	int newWidth = 1080;
	int newheight = 1920;
	
	//      (float  )
	float widthScale = (float) newWidth / width;
	float heightScale = (float) newheight / height;
	
	//      
	matrix.postScale(widthScale, heightScale);
	
	//      (        ,         )
	matrix.preRotate(270);
	bitmap = Bitmap.createBitmap(bitmap ,0,0, width, height,matrix,true);
}

BitMapをローカルSDカードに保存する必要がある場合
コード:
//         
File pictureFile = new File("/sdcard/", "camera.jpg");
try {
	FileOutputStream fos = new FileOutputStream(pictureFile);
	bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
	fos.close();
} catch (Exception error) {
	error.printStackTrace();
}