Sie müssen die Ausrichtung berücksichtigen, wenn Sie bestimmen, welche Vorschaugröße ausgewählt werden soll. Zum Beispiel ist die getOptimalPreviewSize()
aus der CameraPreview
von ApiDemos Orientierung vergessen, einfach weil ihre Version der App die Ausrichtung auf Landschaft gesperrt hat. Wenn Sie die Ausrichtung frei lassen möchten, müssen Sie das Zielseitenverhältnis umkehren, damit es übereinstimmt. Also, wo getOptimalPreviewSize()
hat diese
double targetRatio=(double)width/height;
Und
if (displayOrientation == 90 || displayOrientation == 270) {
targetRatio=(double)height/width;
}
wo displayOrientation
ist ein Wert von 0 bis 360, dass ich von etwa 100 Zeilen einiger ernsthaft hässlich Code bin Bestimmung, weshalb ich bin all dies in einer wiederverwendbaren Komponente, die ich in Kürze veröffentlichen werde.
Zweitens müssen Sie die Ausrichtung des Displays berücksichtigen, wenn Sie das Bildformat des verwendeten SurfaceView
/TextureView
steuern. Die CameraPreview
Aktivität von ApiDemos
hat seine eigene Vorschau ViewGroup
, die das Seitenverhältnis behandelt, und es müssen Sie das Seitenverhältnis für den Einsatz im Hochformat umgekehrt:
if (displayOrientation == 90
|| displayOrientation == 270) {
previewWidth=mPreviewSize.height;
previewHeight=mPreviewSize.width;
}
else {
previewWidth=mPreviewSize.width;
previewHeight=mPreviewSize.height;
}
wo displayOrientation
ist, dass gleicher Wert (90 und 270 Portrait und mehr Reverse-Portrait, und beachten Sie, dass ich nicht versucht habe, Reverse-Portrait oder Reverse-Landscape zu arbeiten, so dass mehr Feinabstimmung erforderlich ist).
Drittens - Sie müssen die Vorschau vor dem Aufruf setPictureSize()
über die Camera.Parameters
starten. Ansonsten verhält es sich so, als ob das Seitenverhältnis des Bildes auf die Vorschaubilder angewendet wird und die Dinge verschraubt werden.
Camera.Parameters parameters=camera.getParameters();
Camera.Size pictureSize=getHost().getPictureSize(parameters);
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
camera.setParameters(parameters);
camera.startPreview();
parameters=camera.getParameters();
parameters.setPictureSize(pictureSize.width, pictureSize.height);
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
Das hat nichts für mich getan – Jill
müssen Sie params.set ("Rotation", 90); anstelle von setDisplayOrientation –
Yup, habe ich das getan. Es hat nichts getan, während setDisplayOrientation etwas getan hatte. – Jill