在某些手机中拍摄时,照片旋转90度

时间:2012-11-22 16:59:12

标签: android android-camera

照片正在旋转90度,同时从三星移动其他手机中的相机捕捉它的工作正常。请帮助我。

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, IMAGE_CAPTURE); 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {     
    super.onActivityResult(requestCode, resultCode, data);    
    try
    {
         if (requestCode == IMAGE_CAPTURE) {
            if (resultCode == RESULT_OK){

                Uri contentUri = data.getData();
                if(contentUri!=null)
                {
                    String[] proj = { MediaStore.Images.Media.DATA };         
                    Cursor cursor = managedQuery(contentUri, proj, null, null, null);         
                    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);         
                    cursor.moveToFirst();         
                    imageUri = Uri.parse(cursor.getString(column_index));
                }

                tempBitmap = (Bitmap) data.getExtras().get("data"); 
                mainImageView.setImageBitmap(tempBitmap);
                isCaptureFromCamera = true;
            }
        }

3 个答案:

答案 0 :(得分:11)

这恰好是Android早期版本中的一个错误。

我解决了这个问题,只是获取方向角并相应地旋转位图。

public  Bitmap decodeFile(String path) {//you can provide file path here 
    int orientation;
    try {
        if (path == null) {
            return null;
        }
        // decode image size 
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        // Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE = 70;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 0;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
                    || height_tmp / 2 < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
        scale++;
        }
        // decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        Bitmap bm = BitmapFactory.decodeFile(path, o2);
        Bitmap bitmap = bm;

        ExifInterface exif = new ExifInterface(path);

        orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);

        Log.e("ExifInteface .........", "rotation ="+orientation);

        //exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90);

        Log.e("orientation", "" + orientation);
        Matrix m = new Matrix();

        if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) {
            m.postRotate(180);
            //m.postScale((float) bm.getWidth(), (float) bm.getHeight());
            // if(m.preRotate(90)){
            Log.e("in orientation", "" + orientation);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),bm.getHeight(), m, true);
            return bitmap;
        } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
            m.postRotate(90); 
            Log.e("in orientation", "" + orientation);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),bm.getHeight(), m, true);
            return bitmap;
        }
        else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
            m.postRotate(270);
            Log.e("in orientation", "" + orientation);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),bm.getHeight(), m, true);
            return bitmap;
        } 
        return bitmap;
    } catch (Exception e) {
        return null;
    }
}

答案 1 :(得分:0)

还查询MediaStore.Images.Media.ORIENTATION值以获取旋转角度。然后你可以自己或其他任何方式旋转图像。

答案 2 :(得分:0)

我在做什么: 首先使用其元数据信息检查相机拍摄的图像的方向,如果我们在纵向中找到这个,那么我们必须将图像旋转90°,否则只显示。

要获取有关图像方向的信息,我们可以使用ExifInterface。  就是这样!