为什么ImageView在ImageView中旋转了90度?

时间:2016-05-03 03:34:58

标签: android

为什么图像在imageView中旋转90度?以及如何解决它?

图库中的所有图片在imageView中都没有旋转90度。

我不知道为什么有些图像会在imageView中旋转90度。

@Override
protected void onActivityResult(int requestCode , int resultCode , Intent data){
    if(requestCode == 100){
        if(resultCode == Activity.RESULT_OK){
            try{
                ImageView imageView = (ImageView)View.inflate(this, R.layout.imagelayout, null);
                Uri imgUri = data.getData();

             Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imgUri);
                int height = bitmap.getHeight();
                int width = bitmap.getWidth();
                int newHeight = height;
                int newWidth = width;
                float rate = 0.0f;

                if(width > height ){
                    if(imageFlipper.getWidth() < width ){
                        rate = imageFlipper.getWidth() / (float) width ;
                        newHeight = (int) (height * rate);
                        newWidth = imageFlipper.getWidth();
                    }
                }else{
                    if(imageFlipper.getHeight() < height ){
                        rate = imageFlipper.getHeight() / (float) height ;
                        newWidth = (int) (width * rate);
                        newHeight = imageFlipper.getHeight();
                    }
                }


              Bitmap reSize = Bitmap.createScaledBitmap(bitmap , newWidth , newHeight,true);

              imageView.setImageBitmap(reSize);

              //imageView.setImageURI(imgUri);
                imageFlipper.addView(imageView);
                imageFlipper.setDisplayedChild(imageFlipper.getChildCount() - 1);

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

4 个答案:

答案 0 :(得分:1)

在某些设备中,启动相机时,方向会发生变化。在我的一个应用程序中,我也遇到了这个问题。为了解决这个问题,我们需要找到方向并相应地旋转图片。

// capture image orientation

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

我们需要使用返回的整数来设置Imageview的角度。

int rotateImage = getCameraPhotoOrientation(this, uriLargeImage,
                    mediaFile.getAbsolutePath());

articleview.setRotation(rotateImage); // articleview is ImageView

所以基本上,请在拍摄时找到照片的方向。这是在ExifInterface中。使用此信息进行旋转。

希望这会有所帮助。一切顺利。

答案 1 :(得分:1)

如前所述,它会自动执行。我修复此问题的方法是使用此ImageCropper,它会自动反向旋转,这真是太神奇了。

点击此处:https://github.com/ArthurHub/Android-Image-Cropper

因此,不仅可以裁剪和旋转图像,而且还可以解决问题!

答案 2 :(得分:0)

您必须在拍摄照片的图像视图中设置旋转度:

 imageView.setRotation(getCameraPhotoOrientation(filepath));
 imageView.setImageURI( Uri.fromFile(filepath));



 public static int getCameraPhotoOrientation(String imagePath) {
    int rotate = 0;
    try {
        ExifInterface exif  = null;
        try {
            exif = new ExifInterface(imagePath);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        int orientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION, 0);
        switch (orientation) {

            case ExifInterface.ORIENTATION_ROTATE_180:
                rotate = 180;
                break;

            case ExifInterface.ORIENTATION_ROTATE_90:
                rotate = 90;
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotate = 90;
                break;
            default:
                rotate = 0;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return rotate;
}

答案 3 :(得分:0)

/** * 顺时针和逆时针旋转位图 */

    btn_clock = (Button) findViewById(R.id.btn_clockWise);
    btn_clock.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Matrix mMatrix = new Matrix();
            Matrix mat=img.getImageMatrix();
            mMatrix.set(mat);
            mMatrix.setRotate(90);
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                    bitmap.getHeight(), mMatrix, false);
            img.setImageBitmap(bitmap);
        }
    });


    btn_antiClock = (Button) findViewById(R.id.btn_AnticlockWise);
    btn_antiClock.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Matrix mMatrix = new Matrix();
            Matrix mat=img.getImageMatrix();
            mMatrix.set(mat);
            mMatrix.setRotate(-90);
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                    bitmap.getHeight(), mMatrix, false);
            img.setImageBitmap(bitmap);
        }
    });