Androidの一部携帯電話のカメラ撮影画像が90度回転される解決方法

3237 ワード

一部の携帯電話は写真を撮った後、画像の回転角度が90度で、現在の解決方法は一般的に画像経路を通じて、画像情報を取得して角度を判断し、角度を変換する.次のようになります.
/**
     *       :     
     * @param path       
     * @return degree     
     */
    public int readPictureDegree(String path) {
        int degree  = 0;
        try {
                ExifInterface exifInterface = new ExifInterface(path);
                int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
                switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                        degree = 90;
                        break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                        degree = 180;
                        break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                        degree = 270;
                        break;
                }
        } catch (IOException e) {
                e.printStackTrace();
        }
        return degree;
    }


 /*
    *      
    * @param angle 
    * @param bitmap 
    * @return Bitmap 
    */ 
   public Bitmap rotaingImageView(int angle , Bitmap bitmap) {  
       //          
       Matrix matrix = new Matrix();
       matrix.postRotate(angle);
       //          
       return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
   }

もしあなたの需要が写真を撮り終わって現れるならば、ここであなたは写真の長さの表示の問題に遭遇します(これは言いません).現在はシステムで写真を撮る必要はありませんが、camera 1 camera 2では上記の方法で画像パスを取得し、自分でローカルに保存しなければなりません.
以下はcamera 1が写真を撮って画像を取得する方法です.
mCamera.takePicture(null, null, null, new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    
                 bitmap=BitmapFactory.decodeByteArray(data,0,data.size)

                //   
                }
            });

次はcamera 2が写真を撮って画像を取得する方法です.
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
            = new ImageReader.OnImageAvailableListener() {

        @Override
        public void onImageAvailable(ImageReader reader) {
            try (Image image = reader.acquireNextImage()) {
                Image.Plane[] planes = image.getPlanes();
                if (planes.length > 0) {
                    ByteBuffer buffer = planes[0].getBuffer();
                    byte[] data = new byte[buffer.remaining()];
                    bitmap= BitmapFactory.decodeByteArray(data, 0, data.size)

                    //   
                }
            }
        }

    };

その後、ローカルに保存するには、ライブラリをリフレッシュしてから、上の画像の角度を取得する方法を呼び出して、画像を正しい角度に回転させ、正しく回転した後、自分で画像を長くするなどの問題を処理する必要があります.
この過程で、画像を保存してから写真情報を取得する方法を呼び出すと効果がありません.それは、同じスレッドで画像ライブラリがリフレッシュされていないためです.あなたが取得した写真情報の角度はずっと0です.
では、自分で何とかして処理してください.展示するときの写真は多少幅が違います.
もしあなたのニーズがローカルに保存されているだけで、展示されていないなら、私の下の内容を見なくてもいいです.
表示が必要な場合、または表示されたbitmapを処理するには、次の方法を使用します.
1.まずTextureViewというコントロールでプレビューをしなければなりません.現在、Surface ViewとTextureViewを比較すると、もちろんTextureViewのほうがいいです.
2.
Bitmap  bitmap_get= mTextureView.getBitmap();

そのまま使えばいいので、現在のプレビュー表示のBitmapを取得します.