EXIF-Orientierungsmarkierungswert ist immer 0 für das Bild, das mit der Porträtkamera-App Android aufgenommen wurde
Ich habe eine Kamera-app im portrait-Modus, die Bilder erfolgt von sowohl front-und back-end-Kameras.Ich bin zu speichern das Bild in meine sd-Karte und versuchen, finden die entsprechenden exif-Wert, der gibt immer 0.Aber ich bin immer die die zu erwartenden exif-orientation-Wert für die anderen Bilder auf dem Gerät gespeichert sind(wie z.B. heruntergeladene Bilder).
Wie kann ich dieses Problem beheben ? Kann mir jemand helfen ?
Hier ist der code verwendet, um das Bild speichern und das finden der Orientierung
PictureCallback myPictureCallback_JPG = new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
//TODO Auto-generated method stub
try {
File APP_FILE_PATH = new File(Environment.getExternalStorageDirectory()
.getPath() + "/Myapp/");
if (!APP_FILE_PATH.exists()) {
APP_FILE_PATH.mkdirs();
}
File file = new File(APP_FILE_PATH, "image.jpg");
FileOutputStream fos = new FileOutputStream(file);
fos.write(arg0);
fos.close();
imageFileUri=Uri.fromfile(file); getApplicationContext().getContentResolver().notifyChange(
imageFileUri, null);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
ExifInterface exif = new ExifInterface(file.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
} catch (Exception e) {
}
}
};
Folgenden ist der code für surphace erstellte und geänderte Funktionen
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
List<Size> sizes = parameters.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, width, height);
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
camera.setParameters(parameters);
camera.startPreview();
startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
Camera.CameraInfo info=new Camera.CameraInfo();
for (int i=0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
camera=Camera.open(i);
defaultCameraId = i;
}
}
}
if (camera == null) {
camera=Camera.open();
}
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Camera.Parameters parameters = camera.getParameters();
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(defaultCameraId, info);
int rotation = this.getWindowManager().getDefaultDisplay()
.getRotation();
if (Integer.parseInt(Build.VERSION.SDK) >= 8)
{
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;
} else { //back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
else
{
parameters.set("orientation", "portrait");
}
camera.setParameters(parameters);
} catch (IllegalArgumentException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
if (sizes == null) return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
InformationsquelleAutor der Frage hacker | 2012-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich auch konfrontiert dasselbe Problem in Samsung-Geräte, später habe ich realisiert ExifInterface und erfolgreich gelöst.
In jedem Modus werden die Bilder schoss es wird immer store im portrait-Modus nur, und beim abholen auch die Rückkehr in den portrait-Modus. unten der code, den ich verwendet, um zu erreichen mein Ziel, das ich umgesetzt habe innerhalb der Kamera zurück, nicht sicher von der Kamera.
Kamera-Vorsatz@
onActivityResult@
decodeFile@
InformationsquelleAutor der Antwort RobinHood
Das problem ist, dass Sie müssen Sie die exif-Informationen manuell in Ihre
onPictureTaken
Funktion.Nachdem Sie das Bild speichern (jpg) erstellen Sie ein Exif-interface ein setzen Sie die Parameter selbst:
Den anderen Bildern, die Sie in Ihrem Telefon sind, mit der eine Anwendung, legt die exif-Informationen der Bilder dauert es.
Erkennen Orientierung:
Und Sie sollten
mOrientation
als Orientierung Attribut für Sie Bild.InformationsquelleAutor der Antwort ALiGOTec
Wurde dieses problem gelöst, vor langer Zeit, aber ich traf einige Schwierigkeiten, um die Kamera korrekt so, hier ist meine endgültige Lösung, ohne exif. Ich hoffe, dass dies anderen helfen :
InformationsquelleAutor der Antwort Louis GRIGNON
Sie ignorieren eine Ausnahme :
Versuchen :
- Und post-logcat. Es ist nie klug, um auf entfernten Ausnahmen.
InformationsquelleAutor der Antwort Binoy Babu