camera2录像旋转,在横向模式下,Android Camera2 Preview旋转90度

I was following a youtube tutorial, trying to learn Camera2 API. Of course, I was learning this at the same time that I was developing my own app. One inconsistency between the tutorial and my app is that the tutorial made the camera in portrait mode only while my app must be in landscape.

I'm currently able to view the preview of the camera, though while my app is in landscape or horizontal, the camera preview looks rotated 90 degrees. It almost feels like I can rotate the TextureView, but that just seems incorrect, like when I take a picture, it will be rotated incorrectly.

Below is the code that has to do with image sizes (the whole code is very long)

private void setupCamera(int width, int height) {

CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

try {

CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(camera_id);

StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);

mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);

mCameraId = camera_id;

} catch (CameraAccessException e) {

e.printStackTrace();

}

}

//TODO Look for a way to make this horizontal

private Size getPreferredPreviewSize(Size[] mapSizes, int width, int height) {

List collectorSizes = new ArrayList<>();

for (Size option : mapSizes) {

if (width > height) { //If the screen is in landscape

Toast.makeText(getApplicationContext(), "Screen is Landscape", Toast.LENGTH_SHORT).show();

if (option.getWidth() > width && option.getHeight() > height) {

collectorSizes.add(option);

}

} else { //if the screen is in portrait

Toast.makeText(getApplicationContext(), "Screen is Portrait", Toast.LENGTH_SHORT).show();

if (option.getWidth() > height && option.getHeight() > width) {

collectorSizes.add(option);

}

}

}

if (collectorSizes.size() > 0) {

return Collections.min(collectorSizes, new Comparator() {

@Override

public int compare(Size lhs, Size rhs) {

return Long.signum(lhs.getWidth() * lhs.getHeight() - rhs.getWidth() + rhs.getHeight());

}

});

}

return mapSizes[0];

}

private void openCamera() {

CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

try {

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

return;

}

cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, null);

} catch (CameraAccessException e){

e.printStackTrace();

}

}

private void createCameraPreviewSession() {

try {

SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();

surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

Surface previewSurface = new Surface(surfaceTexture);

mPreviewCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

mPreviewCaptureRequestBuilder.addTarget(previewSurface);

mCameraDevice.createCaptureSession(Arrays.asList(previewSurface),

new CameraCaptureSession.StateCallback() {

@Override

public void onConfigured(CameraCaptureSession session) {

if(mCameraDevice == null){

return;

}

try {

mPreviewCaptureRequest = mPreviewCaptureRequestBuilder.build();

mCameraCaptureSession = session;

mCameraCaptureSession.setRepeatingRequest(mPreviewCaptureRequest, mSessionCaptureCallback, null);

} catch (CameraAccessException e){

e.printStackTrace();

}

}

@Override

public void onConfigureFailed(CameraCaptureSession session) {

Toast.makeText(getApplicationContext(), "Preview Session Failed", Toast.LENGTH_SHORT).show();

}

}, null);

} catch (CameraAccessException e){

e.printStackTrace();

}

}

I've been playing with the getPreferredPreviewSize method, but I don't understand it as well as I should. I'm not sure about the compare at the end of that using lhs and rhs.

Am I missing something simple to have this rotated?

解决方案private void transformImage (int width, int height)

{

if(mPreviewSize == null || mTextureView == null)

{

return;

}

Matrix matrix = new Matrix();

int rotation = getWindowManager().getDefaultDisplay().getRotation();

RectF textureRectF = new RectF(0,0,width,height);

RectF previewRectF = new RectF(0,0,mPreviewSize.getHeight(),mPreviewSize.getWidth());

float centerX = textureRectF.centerX();

float centery = textureRectF.centerY();

if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)

{}

else if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270)

{

previewRectF.offset(centerX - previewRectF.centerX(),centery-previewRectF.centerY());

matrix.setRectToRect(textureRectF,previewRectF,Matrix.ScaleToFit.FILL);

float scale = Math.max((float)width / mPreviewSize.getWidth(),(float)height/ mPreviewSize.getHeight());

matrix.postScale(scale,scale,centerX,centery);

matrix.postRotate(90*(rotation-2),centerX,centery);

mTextureView.setTransform(matrix );

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值