2017-06-29 52 views
0


拍摄照片我正在使用安装在设备上的相机。 这张照片保存在画廊内部,但是总是水平保存
我该如何解决?
图库中的图片以错误的方向保存

这是当点击按钮 “添加照片” 的意图:

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); 
      } 
     } 
    } 

这是方法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 */ 
     ); 

最后,这是方法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; 
    } 

将照片插入到图库后,我可以根据需要旋转图像。 但是在图库中图像旋转不好。
所以我想用正确的方向将图像保存在画廊中。
谢谢!

回答

0

您必须从(EXIF元数据)收集有关图片方向的信息,因为图片的方向取决于设备内置的相机。 这个代码从EXIF数据中读取信息和旋转图像相应

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); 

信息从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; 
} 

旋转位图方法

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到廊

希望它有帮助!

+0

我已经在imageview.and函数中显示图像,但我需要旋转位图然后将其存储在库 – Ibernato933

+0

@lbernato检查更新的答案。 –

+0

是的,但在methos addGalleryPic之前,如果我调用decodeBitmap(path),sull中的位图。拍摄照片时,如何检索位图? – Ibernato933