【问题标题】:Camera capture orientation on samsung devices in androidandroid中三星设备上的相机捕捉方向
【发布时间】:2013-08-14 17:33:10
【问题描述】:

我正在创建一个相机应用程序。捕获的图像显示在网格视图中。 现在,该代码在除三星设备之外的所有设备上都可以正常运行。

我正面临方向问题。当我以纵向模式拍摄图像时,图像在网格视图中显示时会旋转。我没有保留任何旋转代码。 其次,使用 EXIF,我在网格视图中获得了正确的图像,但是当设备方向发生变化时,图像再次以奇怪的方式旋转。

附加图片:

对不起,图片的分辨率。请让我知道它们是否不正确。将再次上传。我知道有很多这样的帮助。但我想我被困在某个地方了。

我指的是以下链接:

http://blog.andolasoft.com/2013/06/how-to-show-captured-images-dynamically-in-gridview-layout.html

【问题讨论】:

    标签: android android-camera screen-orientation android-orientation android-camera-intent


    【解决方案1】:

    这是我使用的代码(适用于所有设备):

    这部分是我在主要活动中将拍摄的照片设置为图像视图的地方:

                try {
                    File imageFile = new File(cursor.getString(0));
                    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("", "Exif orientation: " + orientation);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Matrix matrix = new Matrix();
                matrix.postRotate(rotate);
                bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
                testImage.setImageBitmap(null);
                testImage.setImageBitmap(bmp);
    

    相机活动中的常量值:

      private static final int ORIENTATION_PORTRAIT_NORMAL =  1;
      private static final int ORIENTATION_PORTRAIT_INVERTED =  2;
      private static final int ORIENTATION_LANDSCAPE_NORMAL =  3;
      private static final int ORIENTATION_LANDSCAPE_INVERTED =  4;
      private OrientationEventListener mOrientationEventListener;
      private int mOrientation =  -1;
    

    相机活动中的回调函数:

          Camera.PictureCallback photoCallback=new Camera.PictureCallback(){
              public void onPictureTaken(final byte[] data, final Camera camera){
    
                  dialog=ProgressDialog.show(CameraActivity.this,"","Please wait while the photo is being saved..");
                  new Thread(){
                      public void run(){
                          try{
                              Thread.sleep(1000);         
                          }
                          catch(Exception ex){}
                          onPictureTake(data,camera);     
                      }
                  }.start();      
              }
          };
    

    相机活动中的拍照功能:

          public void onPictureTake(byte[] data, Camera camera){
              switch (mOrientation) {
              case ORIENTATION_PORTRAIT_NORMAL:
                  rotate = 90;
                  break;
              case ORIENTATION_LANDSCAPE_NORMAL:
                  rotate = 0;
                  break;
              case ORIENTATION_PORTRAIT_INVERTED:
                  rotate = 270;
                  break;
              case ORIENTATION_LANDSCAPE_INVERTED:
                  rotate = 180;
                  break;
              }
    
              Matrix matrix = new Matrix();
              matrix.postRotate(rotate);
              bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
              bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
              mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);
              savePhoto(mutableBitmap);
              dialog.dismiss();
              flag = 0;
              finish();
          }
    

    在相机活动的 onresume 中调用的方向监听器:

    mOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) {
    
                    @SuppressWarnings("deprecation")
                    @Override
                    public void onOrientationChanged(int orientation) {
    
                        // determine our orientation based on sensor response
                        int lastOrientation = mOrientation;
    
                        Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();   
                        int rotation = getWindowManager().getDefaultDisplay().getRotation();
                        System.out.println(rotation+"");
    
                    if (display.getOrientation() != Surface.ROTATION_0) {   // landscape oriented devices
                            System.out.println("LANDSCAPE");
                            if (orientation >= 315 || orientation < 45) {
                                if (mOrientation != ORIENTATION_LANDSCAPE_NORMAL) {                         
                                    mOrientation = ORIENTATION_LANDSCAPE_NORMAL;
                                }
                            } else if (orientation < 315 && orientation >= 225) {
                                if (mOrientation != ORIENTATION_PORTRAIT_INVERTED) {
                                    mOrientation = ORIENTATION_PORTRAIT_INVERTED;
                                }                       
                            } else if (orientation < 225 && orientation >= 135) {
                                if (mOrientation != ORIENTATION_LANDSCAPE_INVERTED) {
                                    mOrientation = ORIENTATION_LANDSCAPE_INVERTED;
                                }                       
                            } else if (orientation <135 && orientation > 45) { 
                                if (mOrientation != ORIENTATION_PORTRAIT_NORMAL) {
                                    mOrientation = ORIENTATION_PORTRAIT_NORMAL;
                                }                       
                            }                       
                        } else {  // portrait oriented devices
                            System.out.println("PORTRAIT");
                            if (orientation >= 315 || orientation < 45) {
                                if (mOrientation != ORIENTATION_PORTRAIT_NORMAL) {                          
                                    mOrientation = ORIENTATION_PORTRAIT_NORMAL;
                                }
                            } else if (orientation < 315 && orientation >= 225) {
                                if (mOrientation != ORIENTATION_LANDSCAPE_NORMAL) {
                                    mOrientation = ORIENTATION_LANDSCAPE_NORMAL;
                                }                       
                            } else if (orientation < 225 && orientation >= 135) {
                                if (mOrientation != ORIENTATION_PORTRAIT_INVERTED) {
                                    mOrientation = ORIENTATION_PORTRAIT_INVERTED;
                                }                       
                            } else if (orientation <135 && orientation > 45) { 
                                if (mOrientation != ORIENTATION_LANDSCAPE_INVERTED) {
                                    mOrientation = ORIENTATION_LANDSCAPE_INVERTED;
                                }                       
                            }
                        }
    
                    }
                };
    

    【讨论】:

    • 只为三星工作!!
    【解决方案2】:

    这是我在我的应用中用于旋转并适用于所有设备的代码:

    private Bitmap adjustImageOrientation(Bitmap image) {
            ExifInterface exif;
            try {
                exif = new ExifInterface(picturePath);
                int exifOrientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_NORMAL);
    
                int rotate = 0;
                switch (exifOrientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotate = 90;
                    break;
    
                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotate = 180;
                    break;
    
                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotate = 270;
                    break;
                }
    
                if (rotate != 0) {
                    int w = image.getWidth();
                    int h = image.getHeight();
    
                    // Setting pre rotate
                    Matrix mtx = new Matrix();
                    mtx.preRotate(rotate);
    
                    // Rotating Bitmap & convert to ARGB_8888, required by tess
                    image = Bitmap.createBitmap(image, 0, 0, w, h, mtx, false);
    
                }
            } catch (IOException e) {
                     return null;
            }
            return image.copy(Bitmap.Config.ARGB_8888, true);
        }
    

    【讨论】:

    • 这是在旋转我的手机屏幕:(
    【解决方案3】:

    首先你需要得到原始文件的方向--

          try {
                            ExifInterface exif = new ExifInterface("File AbsolutePath");
                            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
                            Bitmap bm = rotateBitmap("Old Bitmap", orientation);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
    

    您需要编写一个方法,将位图旋转到正确的方向后返回它。

    public Bitmap rotateBitmap(Bitmap bitmap, int orientation) throws IOException {
    
            Matrix matrix = new Matrix();
            switch (orientation) {
            case ExifInterface.ORIENTATION_NORMAL:
                return bitmap;
            case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                matrix.setScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                matrix.setRotate(180);
                break;
            case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                matrix.setRotate(180);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_TRANSPOSE:
                matrix.setRotate(90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                matrix.setRotate(90);
                break;
            case ExifInterface.ORIENTATION_TRANSVERSE:
                matrix.setRotate(-90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                matrix.setRotate(-90);
                break;
            default:
                return bitmap;
            }
            try {
                Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
                bitmap.recycle();
                return bmRotated;
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
                return null;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2013-08-03
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 2013-01-31
      相关资源
      最近更新 更多