如何旋转从相机或图库中拍摄的图像。 [英] How rotate image taken from camera or gallery.?

查看:117
本文介绍了如何旋转从相机或图库中拍摄的图像。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从相机捕捉图像并从图库中选择图像。在三星设备中,图像在捕获后旋转。

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

    }

}

编辑:

我现在尝试使用相机意图从意图获取路径仍然无效。

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

现在怎么了?

有人可以帮忙吗?出了什么问题?谢谢..

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

推荐答案

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结果方法中并获取旋转图像的值。 。

And put this code in Activity result method and get value to rotate image...

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

这篇关于如何旋转从相机或图库中拍摄的图像。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆