android - 为什么通过相机 Intent 捕获图像后图像会旋转?

标签 android

我已经在相机中停留了 6 天,但没有得到任何适当的解决方案。当我通过相机 Intent 捕捉图像时,图像正在旋转。我试图修复方向,但有时它没有在 onActivityResult() 中提供位图值。当我尝试在 ImageView 中设置图像时显示黑屏。这是我的代码请帮助我-

//call intent to capture image
captureBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                try {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) 
            {
                startActivityForResult(takePictureIntent,AlletConstants.CAPTURE_RECEIPT_IMAGE);
            }

        } catch (Exception e) {

            e.printStackTrace();
        }
            }
});


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

        switch (requestCode) {
        case AlletConstants.CAPTURE_RECEIPT_IMAGE:
            if(data != null)
            {
                Uri qrcodeImageUri = data.getData();
                bitmapReceiptImage = handleQrBarCodeImage(qrcodeImageUri);
                mImageCaptureUri = AlletCommonUtility.bitmapToUri(getActivity(), bitmapReceiptImage);
                doCrop();
                AlletCommonUtility.showToast(getActivity(),"Uri = "+mImageCaptureUri);
            }

            break;

        case AlletConstants.CROP_RECEIPT_FROM_CAMERA:
            if(data != null)
            {
                Bundle qrcodeextras = data.getExtras();
                if (qrcodeextras != null) {
                    Bitmap cropBitmap = qrcodeextras.getParcelable("data");
                    receiptImageView.setImageBitmap(cropBitmap);
                    bitmapReceiptImage = cropBitmap;
                }

                File qrcodeFile = new File(mImageCaptureUri.getPath());
                if (qrcodeFile.exists())
                    qrcodeFile.delete();
            }

            break;      

        default:
            break;
        }

    }




// use to get bitmap from uri 
    private Bitmap handleReceiptImage(Uri selectedImageUri)
    {       
        String[] filePathColumn = {MediaStore.Images.Media.DATA };  

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

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);  
        picturePath = cursor.getString(columnIndex);  
        cursor.close(); 
        Bitmap bitmap = setCameraImageRotation(picturePath);
        return bitmap;
    }

    private Bitmap setCameraImageRotation(String picturePath)
    {
        Bitmap bitmapQrBarImage = null;
         try {
                File f = new File(picturePath);
                ExifInterface exif = new ExifInterface(f.getPath());
                int orientation =  exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);      
                AlletCommonUtility.showToast(getActivity(), "Orienattion = "+orientation);
                Matrix mat = new Matrix();
                mat.postRotate(getImageOrientation(orientation));
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize= 4;
                Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, options);
                bitmapQrBarImage = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true);     

                if (bitmapQrBarImage != null) {
                     AlletCommonUtility.showToast(getActivity(), "CAMERA_PIC_SELECTION = "+bitmapQrBarImage);
                }
            }
            catch (IOException e) {
                Log.w("TAG", "-- Error in setting image");
            }   
            catch(OutOfMemoryError oom) {
                Log.w("TAG", "-- OOM Error in setting image");
            }

         return bitmapQrBarImage;

    }



// Use to crop image
    private void doCrop() {
        final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setType("image/*");

        List<ResolveInfo> list = getActivity().getPackageManager().queryIntentActivities( intent, 0 );

        int size = list.size();

        if (size == 0) {       
            AlletCommonUtility.showToast(getActivity(), AlletMessage.NOT_CROP_IMAGE);           
            return;
        } else {
            intent.setData(mImageCaptureUri);

            intent.putExtra("outputX", 200);
            intent.putExtra("outputY", 200);
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            intent.putExtra("scale", true);
            intent.putExtra("return-data", true);

            if (size == 1) {
                Intent i        = new Intent(intent);
                ResolveInfo res = list.get(0);

                i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                startActivityForResult(i, AlletConstants.CROP_RECEIPT_FROM_CAMERA);

            } else {
                for (ResolveInfo res : list) {
                    final CropOption co = new CropOption();

                    co.title    = getActivity().getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
                    co.icon     = getActivity().getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
                    co.appIntent= new Intent(intent);

                    co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));

                    cropOptions.add(co);
                }

                CropOptionAdapter adapter = new CropOptionAdapter(getActivity(), cropOptions);

                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setTitle("Choose Crop App");
                builder.setAdapter( adapter, new DialogInterface.OnClickListener() {
                    public void onClick( DialogInterface dialog, int item ) {
                        startActivityForResult( cropOptions.get(item).appIntent, AlletConstants.CROP_RECEIPT_FROM_CAMERA); 
                    }
                });

                builder.setOnCancelListener( new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel( DialogInterface dialog ) {

                        if (mImageCaptureUri != null ) {
                            getActivity().getContentResolver().delete(mImageCaptureUri, null, null );
                            mImageCaptureUri = null;
                        }
                    }
                } );

                AlertDialog alert = builder.create();

                alert.show();
            }
        }
    }



// use to rotate captured image from device camera 
public static int getImageOrientation(int rotation)
    {
         int angle = 0;

            switch (rotation) {
            case 0:
                angle = 90;
                break;

            case ExifInterface.ORIENTATION_ROTATE_90:
                angle = 90;
                break;

            case ExifInterface.ORIENTATION_ROTATE_180:
                angle = 180;
                break;

            case ExifInterface.ORIENTATION_ROTATE_270:
                angle = 270;
                break;
            default:
                break;
            }

            return angle;

    }

我在横向模式下获取图像,但在纵向模式下却没有。拍摄图像后,相机预览会自动旋转 90 度。

最佳答案

这是因为图像的 EXIF 数据。您需要使用旋转方法。

关于android - 为什么通过相机 Intent 捕获图像后图像会旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529105/

相关文章:

android - USB_DEVICE_ATTACHED 只启动 Galaxy S3 ICS 的 Activity

android - css 居中在 Phonegap 中不起作用

android - 发送邮件后如何再次移动MainActivity?

Android - 从 SQLite 表行中检索所有数据

Android Studio build.gradle 无法识别 gradle.properties 中的变量

Android TTS 说 0 为 "oh"

Android:使用 1 个 Activity 的主/详细流程(双 Pane )

java - 如何从具有 gradle 依赖性的代码创建 Android 库?

android - 有没有办法直接使用 SpeechRecognizer API 进行语音输入?

java - LIBGDX,安卓 : deadlock killing app when when returning captured picture