How rotate image taken from camera or gallery.?

时间:2016-10-20 13:23:52

标签: java android image rotation

I am capturing image from camera and selecting image from gallery. In samsung devices the images gets rotate after captured.

I want rotate image to straight if they are rotated.

I tried to do it but its not working.

   private void onCaptureImageResult(Intent data) {
    try {

    Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    thumbnail.compress(Bitmap.CompressFormat.PNG, 100, bytes);

    File destination = new File(Environment.getExternalStorageDirectory(),
            System.currentTimeMillis() + ".png");

    FileOutputStream fo;

        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();


    profileImage = destination;

    Bitmap rotatedBitmap = modifyOrientation(thumbnail, profileImage.getAbsolutePath());

    ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
    rotatedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream1); //replace 100 with desired quality percentage.
    byte[] byteArray1 = stream1.toByteArray();

    File tempFile1 = File.createTempFile("temp", null, getCacheDir());
    FileOutputStream fos1 = new FileOutputStream(tempFile1);
    fos1.write(byteArray1);


    if (rotatedBitmap != null) {
        profileImageView.setImageBitmap(rotatedBitmap);
        profileImage = tempFile1;
    } else {
        profileImageView.setImageBitmap(thumbnail);
        profileImage = destination;
    }

}
    catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

@SuppressWarnings("deprecation")
private void onSelectFromGalleryResult(Intent data) {

    Bitmap bm=null;
    if (data != null) {
        try {
            bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 100, stream); //replace 100 with desired quality percentage.
    byte[] byteArray = stream.toByteArray();

    try {

        File tempFile = File.createTempFile("temp",null, getCacheDir());
        FileOutputStream fos = new FileOutputStream(tempFile);
        fos.write(byteArray);

        profileImage = tempFile;

        Bitmap rotatedBitmap = modifyOrientation(bm,profileImage.getAbsolutePath());

        ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.PNG, 100, stream1); //replace 100 with desired quality percentage.
        byte[] byteArray1 = stream1.toByteArray();

        File tempFile1 = File.createTempFile("temp",null, getCacheDir());
        FileOutputStream fos1 = new FileOutputStream(tempFile1);
        fos1.write(byteArray1);



        if(rotatedBitmap != null) {
            profileImageView.setImageBitmap(rotatedBitmap);
            profileImage = tempFile1;
        }
        else {
            profileImageView.setImageBitmap(bm);
            profileImage = tempFile;
        }
    }

    catch (IOException e)
    {

    }

}

EDIT:

I tried to use camera intent now and get path from intent still its not working.

private void onCaptureImageResult(Intent data) {
    try {

    Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    thumbnail.compress(Bitmap.CompressFormat.PNG, 100, bytes);

    File destination = new File(Environment.getExternalStorageDirectory(),
            System.currentTimeMillis() + ".png");

    FileOutputStream fo;

        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();
        Bitmap rotatedBitmap = null;

   // profileImage = destination;

        Uri tempUri = getImageUri(getApplicationContext(),thumbnail);

        // CALL THIS METHOD TO GET THE ACTUAL PATH
        File finalFile = new File(getRealPathFromURI(tempUri));

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

        switch(orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                rotateImage(thumbnail, 90);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                rotateImage(thumbnail, 180);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotateImage(thumbnail, 270);
                break;
            case ExifInterface.ORIENTATION_NORMAL:
            default:
                break;
        }

    if (rotatedBitmap != null) {

        profileImageView.setImageBitmap(rotatedBitmap);

        ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
        rotatedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream1); //replace 100 with desired quality percentage.
        byte[] byteArray1 = stream1.toByteArray();

        File tempFile1 = File.createTempFile("temp", null, getCacheDir());
        FileOutputStream fos1 = new FileOutputStream(tempFile1);
        fos1.write(byteArray1);

        profileImage = tempFile1;
    } else {
        profileImageView.setImageBitmap(thumbnail);
        profileImage = destination;
    }

}
    catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
   }


public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.PNG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}



   @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_FILE)
            onSelectFromGalleryResult(data);
        else if (requestCode == REQUEST_CAMERA)
            onCaptureImageResult(data);
    }
}

What's wrong now?

Can anyone help please? What's going wrong? Thank you..

2 个答案:

答案 0 :(得分:0)

profileImage = destination;

您获取了位图缩略图并将其写入文件。

之后,您使用该文件提取exifinterface。

但位图不包含exif信息。因此你的文件也没有。

因此,您的方向始终为空;

如果您使用profileImage启动相机意图,请保持原样。

请删除上述声明。

答案 1 :(得分:0)

public int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath){
 int rotate = 0;
try {
    context.getContentResolver().notifyChange(imageUri, null);
    File imageFile = new File(imagePath);

    ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
    int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

    switch (orientation) {
    case ExifInterface.ORIENTATION_ROTATE_270:
        rotate = 270;
        break;
    case ExifInterface.ORIENTATION_ROTATE_180:
        rotate = 180;
        break;
    case ExifInterface.ORIENTATION_ROTATE_90:
        rotate = 90;
        break;
    }

    Log.i("RotateImage", "Exif orientation: " + orientation);
    Log.i("RotateImage", "Rotate value: " + rotate);
} catch (Exception e) {
    e.printStackTrace();
}
return rotate;
}

并将此代码放在Activity结果方法中并获取旋转图像的值...

String selectedImage = data.getData();
        String[] filePathColumn = {MediaStore.Images.Media.DATA};

        Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        filePath = cursor.getString(columnIndex);
        cursor.close();

        int rotateImage = getCameraPhotoOrientation(MyActivity.this, selectedImage, filePath);

使用此

旋转位图
 public static Bitmap rotate(Bitmap bitmap, float degrees) {
   Matrix matrix = new Matrix();
   matrix.postRotate(degrees);
   return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
  }