마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

앱개발중 카메라문제(촬영후 이미지 회전)

0 추천
앱 개발중인 초보개발자입니다. 촬영후 이미지가 넘어가서 이미지뷰에 보여주는 코드인데 사진이 90도 회전되어서 나옵니다. 수정사항 가르켜주시면 열심히 배우겠습니다.(찾아보고 적용해도 안먹어서 ㅠㅠ

public class CameraActivity extends AppCompatActivity {
    private String mCurrentPhotoPath;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        try {
            File phtoFile = createImageFile();
            Uri photoUri = FileProvider.getUriForFile(this, "com.hionshop.hionevent.fileprovider", phtoFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
            startActivityForResult(intent, 0);

        } catch (IOException e) {
            e.printStackTrace();
            ImageView imageView = (ImageView) findViewById(R.id.imageView2);
            imageView.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));

        }
        requirePermission();
            @Override
            public void onClick(View view) {

                takePicture();

            }
        });
      
    }
    void takePicture() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        try {
            File phtoFile = createImageFile();
            Uri photoUri = FileProvider.getUriForFile(this, "com.hionshop.hionevent.fileprovider", phtoFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
            startActivityForResult(intent, 0);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private File createImageFile() throws IOException {
        // Create an image file name 이미지 파일 만들기
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */

        );
        mCurrentPhotoPath = image.getAbsolutePath();
        return image;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == 0) {
            ImageView imageView = (ImageView) findViewById(R.id.imageView2);
            imageView.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));
        }
    }
    private Bitmap rotate(Bitmap src, float degree){
        Matrix matrix = new Matrix();
        matrix.postRotate(degree);
        return Bitmap.createBitmap(src,0,0,src.getWidth(),src.getHeight(),matrix, true);

    }
}

)
익명사용자 님이 2018년 5월 16일 질문

1개의 답변

0 추천
제가 사용했던 회전각에 대한 정보를 받아와서 해당 회전각 만큼 사진을 회전시켜주는 코드에요

 private Bitmap rotate(ExifInterface ei, Bitmap bitmap, int quality)
    {

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream);

        // 이미지 정보 객체에서 회전에 대한 정보를 추출
        int exifOrientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

        // 해당 정보를 기반으로 int 회전각 수치를 추출
        int exifDegree = exifOrientationToDegrees(exifOrientation);

        if (exifDegree != 0 && bitmap != null)
        {
            Matrix m = new Matrix();

            // 회전각을 적용 시키고 일단은 해당 사진 크기의 절반 정도 크기로 줄인다
            m.setRotate(exifDegree, bitmap.getWidth(), bitmap.getHeight());

            try
            {
                // 회전 !
                Bitmap converted = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);

                if (bitmap != converted)
                {
                    bitmap.recycle();
                    bitmap = converted;
                }
            }
            catch (OutOfMemoryError ex)
            {
                // 메모리가 부족하여 회전을 시키지 못할 경우 그냥 원본을 반환.
                ex.printStackTrace();
            }
        }
        return bitmap;
    }

    private int exifOrientationToDegrees(int exifOrientation)
    {
        if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90)
        {
            return 90;
        }
        else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180)
        {
            return 180;
        }
        else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270)
        {
            return 270;
        }
        return 0;
    }

 

위 rotate 함수를

bitmap = rotate(new ExifInterface(이미지url), 이미지bitmp, 퀄리티);

이렇게 사용해주시면 됩니다.
익명사용자 님이 2018년 5월 17일 답변
댓글 감사합니다ㅠㅠㅠㅠ 아직 초보자라 그런데 bitmap= rotate(new Exifinterface(이미지url), 이미지 bitmap, 퀄리티); 이부분에 이미지 bitmap이랑 퀄리티 에 어떤게 들어가야할지 잘 모르겠네요ㅠㅠ
이미지 bitmap은 가지고 계신 이미지 url을 활용해서 추출해낸 bitmap 객체 넘겨주시면되고요 퀄리티는 말그대로 화질을 얼마나 유지하겟느냐입니다.
0~100 값을 넣어주시면되요
...