>

버튼을 클릭하면 카메라 앱이 열립니다. 다음 활동에서 캡처 한 사진을 표시합니다. 그러나 캡처 된 사진은 90도 회전합니다. 이미지를 캡처 한 후보기에 이미지를 표시하면 방향은 항상 가로입니다. 사진을 세로 모드로 촬영할 때 사진이 세로로 표시되지 않는 이유는 무엇입니까?

on 버튼 클릭 :

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(APP_DIR+"/latest.png")));       
startActivityForResult(i, CAPTURE_PHOTO_CONSTANT);

onActvityresult 내부 :

bmp = BitmapFactory.decodeFile(APP_DIR+"/latest.png");
startActivity(new Intent(this, DisplayActivity.class));

촬영 된 사진 표시 :

photoViewRelativeLayout.setBackgroundDrawable(new BitmapDrawable(getResources(), CaptureActivity.bmp));

  • 답변 # 1

    주로 삼성 핸드셋과 동일한 문제가 있었지만, 삼성 폰은 개별 픽셀을 회전시키는 대신 EXIF ​​방향 태그를 설정 한 것 같습니다 .BitmapFactory를 사용하여 비트 맵을 읽는 것은이 태그를 지원하지 않습니다. 활동의 onActivityResult 메소드에있는 ExifInterface. 카메라에서 캡처 된 이미지의 URI와 연관된 방향을 확인합니다.

                           int rotate = 0;
                            try {
                                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.v(Common.TAG, "Exif orientation: " + orientation);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            /****** Image rotation ****/
                            Matrix matrix = new Matrix();
                            matrix.postRotate(orientation);
                            Bitmap cropped = Bitmap.createBitmap(scaled, x, y, width, height, matrix, true);
    
    

  • 답변 # 2

    약간 효과가있었습니다. 가로 모드에서 사진을 찍으면 모든 것이 이전처럼 잘 작동합니다. 세로 모드로 사진을 찍으면 카메라를 뒤집어 사진을 찍어야합니다. 각 방향 앞에 "ExifInterface"를 추가하여 코드를 약간 변경했습니다. 다음 코드를 사용했습니다.

       try {
          ExifInterface exif = new ExifInterface(filename); 
          int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
                              ExifInterface.ORIENTATION_NORMAL);
          int rotate = 0;
             switch(orientation) {
                case  ExifInterface.ORIENTATION_ROTATE_270:
                     rotate-=90;break;
                case  ExifInterface.ORIENTATION_ROTATE_180:
                     rotate-=90;break;
                case  ExifInterface.ORIENTATION_ROTATE_90:
                     rotate-=90;break;
                }
                  Log.d("Fragment", "EXIF info for file " + filename + ": " + rotate);
             } catch (IOException e) {
                 Log.d("Fragment", "Could not get EXIF info for file " + filename + ": " + e);
             }
    
    

  • 답변 # 3

    글라이드를 대신 사용하십시오. 방향 자체를 수정하며 사용중인 모바일에 관계없이 다음은 샘플입니다

    Glide.with(_c).load(horizontalList.get(position).imagePath).into(holder.img_injury);
    
    

  • 답변 # 4

    동시에 간단히 회전 할 수 있습니다

    onActvityresult에서이 코드를 사용하여 촬영 한 이미지의 오리엔테이션을 가져옵니다 ....

    File imageFile = new File(imageUri.toString());
           ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
           int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
           int rotate = 0;
           switch(orientation) {
             case ORIENTATION_ROTATE_270:
                 rotate-=90;break;
             case ORIENTATION_ROTATE_180:
                 rotate-=90;break
             case ORIENTATION_ROTATE_90:
                 rotate-=90;break
           }
    
    

  • 이전 MySQL에서 힌디어를 삽입하는 방법
  • 다음 Windows에서 기본 소켓 버퍼 크기 변경