2017-06-29 4 views
0


Um ein Foto zu machen, verwende ich die Kamera auf dem Gerät installiert. Das Foto ist in der Galerie gespeichert, wird aber immer horizontal gespeichert.
Wie behebe ich es?
Bild in der Galerie wird mit falscher Ausrichtung gespeichert

Dies ist die Absicht, wenn Sie auf die Schaltfläche "Foto hinzufügen":

private void dispatchTakePictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     // Ensure that there's a camera activity to handle the intent 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException ex) { 
       // Error occurred while creating the File 
       ex.printStackTrace(); 
      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       Uri photoURI = null; 
       photoURI = galleryAddPic(); 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
       startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
      } 
     } 
    } 

Dies ist die Methode createImageFile():

private File createImageFile() throws IOException { 
     // Create an image file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     imageFileName = "JPG_" + timeStamp + "_"; 
     File storageDir = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES); 
     File image = File.createTempFile(
       imageFileName, /* prefix */ 
       ".jpg",   /* suffix */ 
       storageDir  /* directory */ 
     ); 

Am Ende wird dies die Methode galleryAddPic():

private Uri galleryAddPic(){ 
     Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     File f = new File(mCurrentPhotoPath); 
     Uri contentUri = Uri.fromFile(f); 
     mediaScanIntent.setData(contentUri); 
     this.sendBroadcast(mediaScanIntent); 
     return contentUri; 
    } 
     // Save a file: path for use with ACTION_VIEW intents 
     mCurrentPhotoPath = image.getAbsolutePath(); 
     return image; 
    } 

Nachdem ich das Foto in die Galerie eingefügt habe, kann ich das Bild so drehen, wie ich es möchte. Aber in der Galerie wird das Bild nicht gut gedreht.
Also möchte ich das Bild in der Galerie mit der richtigen Ausrichtung speichern.
Danke!

Antwort

0

Sie müssen Informationen über die Ausrichtung des Bildes von (EXIF-Metadaten) sammeln, da die Bildausrichtung von der in das Gerät eingebauten Kamera abhängt. dieser Code liest Informationen aus EXIF-Daten und drehen Bild entsprechend

BitmapFactory.Options bounds = new BitmapFactory.Options(); 
bounds.inJustDecodeBounds = true; 
BitmapFactory.decodeFile(file, bounds); 

BitmapFactory.Options opts = new BitmapFactory.Options(); 
Bitmap bm = BitmapFactory.decodeFile(file, opts); 
ExifInterface exif = new ExifInterface(file); 
String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 
int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL; 

int rotationAngle = 0; 
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90; 
if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180; 
if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270; 

Matrix matrix = new Matrix(); 
matrix.setRotate(rotationAngle, (float) bm.getWidth()/2, (float) bm.getHeight()/2); 
Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true); 

Informationen vom EXIF ​​:

ExifInterface ei = new ExifInterface(photoPath); 
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
            ExifInterface.ORIENTATION_UNDEFINED); 

switch(orientation) { 

    case ExifInterface.ORIENTATION_ROTATE_90: 
     rotateImage(bitmap, 90); 
     break; 

    case ExifInterface.ORIENTATION_ROTATE_180: 
     rotateImage(bitmap, 180); 
     break; 

    case ExifInterface.ORIENTATION_ROTATE_270: 
     rotateImage(bitmap, 270); 
     break; 

    case ExifInterface.ORIENTATION_NORMAL: 

    default: 
     break; 
} 

drehen Bitmap-Methode

public static Bitmap rotateImage(Bitmap source, float angle) { 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle); 
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), 
           matrix, true); 
} 

SAVE Bitmap zur Galerie

hoffe es hilft !!

+0

Ich mache dies bereits in einer Methode, um das Bild in einer imageview.and -Funktion anzuzeigen, aber ich muss das Bitmap drehen und dann in der Galerie speichern – Ibernato933

+0

@lbernato überprüfen Sie die aktualisierte Antwort. –

+0

Ja, aber vor dem methos addGalleryPic, Bitmap in sull, wenn ich decodeBitmap (Pfad) aufrufen. Wenn Sie ein Foto machen, wie wird das Bitmap reaktiviert? – Ibernato933

Verwandte Themen