Ich versuche, einige ImageProcessing auf dem aktuellen Frame der Vorschau in Android zu tun. Bei jedem anderen Smartphone funktioniert es ziemlich gut. Aber jetzt muss ich die App für das Nexus 5x zugänglich machen.Nexus 5x Frames von Vorschau sind gedreht Camera2
Dort bekomme ich ein um 180 Grad gedrehtes Bild aus der Vorschau. Wie kann ich das beheben? Hier mein Code meine Kamera und die Vorschau für die Einrichtung:
private void resetCamera(int width, int height){
Log.d(TAG, "Reset Camera!");
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
for (String cameraId : cameraManager.getCameraIdList()) {
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
mSensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) {
continue;
}
StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mImageReader = ImageReader.newInstance(width,
height,
ImageFormat.YUV_420_888,
10);
mImageReader.setOnImageAvailableListener(mOnImageAvailableTrack,
mBackgroundHandler);
mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);
mCameraId = cameraId;
return;
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
Vorschau:
private void createTrackingPreviewSession(){
try{
SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface previewSurface = new Surface(surfaceTexture);
mPreviewCaptureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewCaptureBuilder.addTarget(previewSurface);
mPreviewCaptureBuilder.addTarget(mImageReader.getSurface());
int rotation = getWindowManager().getDefaultDisplay().getRotation();
mPreviewCaptureBuilder.set(CaptureRequest.JPEG_ORIENTATION,
getOrientation(rotation));
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, mImageReader.getSurface()),
new CameraCaptureSession.StateCallback(){
@Override
public void onConfigured(CameraCaptureSession session) {
if(mCameraDevice == null){
return;
}
try{
Toast.makeText(getApplicationContext(), "Create Tracking Session", Toast.LENGTH_SHORT).show();
mPreviewCapture = mPreviewCaptureBuilder.build();
mCaptureSession = session;
mCaptureSession.setRepeatingRequest(
mPreviewCapture,
mSessionCaptureCallback,
mBackgroundHandler
);
} catch(CameraAccessException e){
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
Toast.makeText(
getApplicationContext(),
"create Camera session failed!",
Toast.LENGTH_SHORT
).show();
}
}, null);
} catch(CameraAccessException e){
e.printStackTrace();
}
}
Wie Sie sehen können, habe ich eine Bild zu erfassen, um das Update zu verwenden versucht, aber es nicht tat Hilfe bekomme ich immer noch ein gedrehtes Bild aus der Vorschau.
Wenn es möglich ist, möchte ich eine Lösung, die versucht, die Einstellungen der Kamera zu ändern. Ich möchte das Bild nicht selbst drehen, nachdem ich es durch den gebundenen ImageReader bekommen habe.
Nein, die Vorschau ist normal und in Ordnung. Aber wenn ich ein "Photo" mache (bekomme den aktuellen Frame durch einen ImageReader), wird es um 90 Grad gedreht. Ich verwende die configure transform-Methode bereits, um die Vorschau korrekt anzuzeigen. –
Rufen Sie captureBuilder.set (CaptureRequest.JPEG_ORIENTATION, getOrientation (Rotation)); – greenteafox
Mit der richtigen Rotation? Einige Kamera-Geräte-Rotationen sind 90, wie Ihr Nexus-Telefon und einige andere sind 270. – greenteafox