Wenn Sie die Kamera für die Aufnahme von Bildern im Hochformat steuern, werden die endgültigen Bilder nicht gedreht
Ich versuche, die Steuerung der Android-Kamera nehmen Sie Bilder im Porträt-app, aber wenn ich das Bild speichern, es ist in der Landschaft. Ich habe das Bild gedreht 90 Sorten mit setCameraDisplayOrientation()
Methode, funktioniert aber nicht.
Dann ich habe festgestellt, das post aber die TAG_ORIENTATION
ist 0
(undefined). Wenn ich fangen Sie diesen Wert und gilt ein Wert für Drehung, funktioniert auch nicht.
Wie kann ich ein Foto im hochformat und speichern Sie es mit der Orientierung?
/** Initializes the back/front camera */
private boolean initPhotoCamera() {
try {
camera = getCameraInstance(selected_camera);
Camera.Parameters parameters = camera.getParameters();
// parameters.setPreviewSize(width_video, height_video);
// parameters.set("orientation", "portrait");
// parameters.set("rotation", 1);
// camera.setParameters(parameters);
checkCameraFlash(parameters);
// camera.setDisplayOrientation( 0);
setCameraDisplayOrientation(selected_camera, camera);
surface_view.getHolder().setFixedSize(width_video, height_video);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width_video, height_video);
surface_view.setLayoutParams(lp);
camera.lock();
surface_holder = surface_view.getHolder();
surface_holder.addCallback(this);
surface_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
setPreviewCamera();
} catch (Exception e) {
Log.v("RecordVideo", "Could not initialize the Camera");
return false;
}
return true;
}
public void setCameraDisplayOrientation(int cameraId, Camera camera) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; //compensate the mirror
} else { //back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
public static Bitmap rotate(Bitmap bitmap, int degree) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Matrix mtx = new Matrix();
// mtx.postRotate(degree);
mtx.setRotate(degree);
return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
String timeStamp = Calendar.getInstance().getTime().toString();
output_file_name = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + timeStamp + ".jpeg";
File pictureFile = new File(output_file_name);
if (pictureFile.exists()) {
pictureFile.delete();
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
Bitmap realImage = BitmapFactory.decodeFile(output_file_name);
ExifInterface exif=new ExifInterface(pictureFile.toString());
Log.d("EXIF value", exif.getAttribute(ExifInterface.TAG_ORIENTATION));
if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("6")){
realImage= rotate(realImage, 90);
} else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("8")){
realImage= rotate(realImage, 270);
} else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("3")){
realImage= rotate(realImage, 180);
} else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("0")){
realImage= rotate(realImage, 45);
}
boolean bo = realImage.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
Log.d("Info", bo + "");
} catch (FileNotFoundException e) {
Log.d("Info", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("TAG", "Error accessing file: " + e.getMessage());
}
}
InformationsquelleAutor der Frage beni | 2013-04-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den setCameraDisplayOrientation() Methode können Sie ändern, wie die Album Vorhören angezeigt ohnewie das Bild aufgezeichnet wird (Quelle).
Damit ändern Sie das aufgezeichnete Bild, das Sie benötigen, um die rotation parameter der Kamera. Sie tun es so:
Ihre Lösung ist eine Art workaround, da Sie ändern das Bild, NACHDEM es bereits aufgenommen. Diese Lösung ist sauberer und nicht verlangen, dass alle diese "wenn" - Anweisungen, bevor Sie das Bild speichern.
InformationsquelleAutor der Antwort Nimrod Dayan
Das problem ist, wenn ich das Bild gespeichert, die ich nicht so gut.
InformationsquelleAutor der Antwort beni
Können Sie verwenden Sie die Methode zum generieren der Vorschau richtig, wenn Ihr mit der front-Kamera.
Dieser code geht in surfaceChanged Methode Ihrer Kamera Album Vorhören
Dieser code kann in eine statische Klasse
Können Sie Drehen, Bild auf diese Weise.Dieser wird nur verwendet, wenn image ist genommen und wir sind dabei, das Bild zu speichern
Die Methode, die verwendet werden für die Aufnahme von Bild
Den
bitmapImage
enthält das richtige Bild.InformationsquelleAutor der Antwort Sheraz Ahmad Khilji
sollte man dieses Werk, ExifInterface funktioniert nicht mit allen fertigt so verwenden CameraInfo statt, lassen Sie Kamera-capture-Bild mit Standard-rotation und drehen Sie dann die Ergebnis-Daten auf PictureCallback
InformationsquelleAutor der Antwort nvhausid
Ich finde die leistungsfähige Antwort für Sie, ich habe gerade das gleiche problem und lösen es ohne speichern der Datei.Die Lösung ist zum registrieren einer OrientationEventListener zu Holen Sie sich die Orientierung, wenn es geändert.http://www.androidzeitgeist.com/2013/01/fixing-rotation-camera-picture.html hier geben Sie die Kontaktdaten.Mein code ist wie folgt:
hoffe es hilft:)
InformationsquelleAutor der Antwort Yueh-Ming Chien
Dies ist die beste Methode zu verwenden (weiter Unten Erwähnt), wenn Ihr layout ist fest im portrait-Modus.
Werden Sie mit OrientEventListener und Umsetzung dieser call-back-Verfahren.
onOrientationChanged genannt wird, wenn es eine änderung in der Orientierung, damit Sie Ihre Kamera-Drehung wird eingestellt und das Bild wird gedreht, wenn Sie es speichern.
getOutputMediaFile
Quelle Hier
InformationsquelleAutor der Antwort KD_
Ich habe nicht die rep um einen Kommentar zu hinterlassen, also habe ich Sie verlassen, eine andere Antwort statt, obwohl Nvhausid Antwort ist genial und verdient den Kredit. Schlicht, elegant und es funktioniert für beide Vorder-und Rückseite Kameras auf einem Samsung-Gerät, wo Exif-und Medien-Cursor nicht.
Das einzige, was die Antwort fehlte für mich war der Umgang mit dem Spiegel-Bild von der Kamera vor dem Benutzer.
Hier ist die code-änderungen für:
Und die neuen drehen Methode:
InformationsquelleAutor der Antwort D. Scott
Ich habe die neue Kamera2-api, um sensor-Ausrichtung und drehen Sie ihn dann entsprechend:
Dann mit Hilfe von cameraOrientation parameter, die ich gedreht meine cameraPhoto:
InformationsquelleAutor der Antwort Rushi M Thakker