2016-10-12 6 views
1

Ich bin benutzerdefinierte Kameraaktivität erstellt Aber das Bild ist in falscher Ausrichtung. Wenn ich das Bild im Hochformat und nach der Drehung um 90 Grad aufgenommen habe, befindet es sich in der Originalposition, nimmt aber im Querformat das Bild in falscher Ausrichtung auf.Captured Bild mit benutzerdefinierten Kamera ist in falscher Ausrichtung

Ausrichtung der Kamera Während der Aufnahme im Querformat. enter image description here

Bild Resultierte Orientierung enter image description here

Kamera Während Modus Problem

enter image description here

Resultierte Bild enter image description here

Für resolve Kamera Vorschaubild im Portrait zu erfassen.

public int setPhotoOrientation(Activity activity, int cameraId) { 
     android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(cameraId, info); 
     int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: 
       degrees = 0; 
       break; 
      case Surface.ROTATION_90: 
       degrees = 90; 
       break; 
      case Surface.ROTATION_180: 
       degrees = 180; 
       break; 
      case Surface.ROTATION_270: 
       degrees = 270; 
       break; 
     } 

     int result; 
     // do something for phones running an SDK before lollipop 
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      result = (info.orientation + degrees) % 360; 
      result = (360 - result) % 360; // compensate the mirror 
     } else { // back-facing 
      result = (info.orientation - degrees + 360) % 360; 
     } 

     return result; 
    } 

Überprüfen Sie die Bitmap-Ausrichtung.

Antwort

0

Endlich gefundene Lösung.Prüfen Sie die Ausrichtung mit dem Orientierungssensor und finden Sie den Winkel entsprechend dem Winkel und drehen Sie das Bild mit diesem Winkel.

public abstract class SimpleOrientationListener extends OrientationEventListener { 

    public static final int CONFIGURATION_ORIENTATION_UNDEFINED = Configuration.ORIENTATION_UNDEFINED; 
    private volatile int defaultScreenOrientation = CONFIGURATION_ORIENTATION_UNDEFINED; 
    public int prevOrientation = OrientationEventListener.ORIENTATION_UNKNOWN; 
    private Context ctx; 
    private ReentrantLock lock = new ReentrantLock(true); 

    public SimpleOrientationListener(Context context) { 
     super(context); 
     ctx = context; 
    } 

    public SimpleOrientationListener(Context context, int rate) { 
     super(context, rate); 
     ctx = context; 
    } 

    @Override 
    public void onOrientationChanged(final int orientation) { 


     int currentOrientation = OrientationEventListener.ORIENTATION_UNKNOWN; 
     int angle=0; 
     if (orientation >= 330 || orientation < 30) { 
      currentOrientation = Surface.ROTATION_0; 
      angle=90; 
     } else if (orientation >= 60 && orientation < 120) { 
      currentOrientation = Surface.ROTATION_90; 
      angle=180; 
     } else if (orientation >= 150 && orientation < 210) { 
      currentOrientation = Surface.ROTATION_180; 
      angle=270; 
     } else if (orientation >= 240 && orientation < 300) { 
      currentOrientation = Surface.ROTATION_270; 
      angle=360; 
     } 
     getset g = new getset(); 
     g.setK(angle); 
     if (prevOrientation != currentOrientation && orientation != OrientationEventListener.ORIENTATION_UNKNOWN) { 
      prevOrientation = currentOrientation; 
      if (currentOrientation != OrientationEventListener.ORIENTATION_UNKNOWN) 
       reportOrientationChanged(currentOrientation); 
     } 

    } 

    private void reportOrientationChanged(final int currentOrientation) { 

     int defaultOrientation = getDeviceDefaultOrientation(); 
     int orthogonalOrientation = defaultOrientation == Configuration.ORIENTATION_LANDSCAPE ? Configuration.ORIENTATION_PORTRAIT 
       : Configuration.ORIENTATION_LANDSCAPE; 

     int toReportOrientation; 

     if (currentOrientation == Surface.ROTATION_0 || currentOrientation == Surface.ROTATION_180) 
      toReportOrientation = defaultOrientation; 
     else 
      toReportOrientation = orthogonalOrientation; 

     onSimpleOrientationChanged(toReportOrientation); 
    } 

    /** 
    * Must determine what is default device orientation (some tablets can have default landscape). Must be initialized when device orientation is defined. 
    * 
    * @return value of {@link Configuration#ORIENTATION_LANDSCAPE} or {@link Configuration#ORIENTATION_PORTRAIT} 
    */ 
    private int getDeviceDefaultOrientation() { 
     if (defaultScreenOrientation == CONFIGURATION_ORIENTATION_UNDEFINED) { 
      lock.lock(); 
      defaultScreenOrientation = initDeviceDefaultOrientation(ctx); 
      lock.unlock(); 
     } 
     return defaultScreenOrientation; 
    } 

    /** 
    * Provides device default orientation 
    * 
    * @return value of {@link Configuration#ORIENTATION_LANDSCAPE} or {@link Configuration#ORIENTATION_PORTRAIT} 
    */ 
    private int initDeviceDefaultOrientation(Context context) { 

     WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     Configuration config = context.getResources().getConfiguration(); 
     int rotation = windowManager.getDefaultDisplay().getRotation(); 

     boolean isLand = config.orientation == Configuration.ORIENTATION_LANDSCAPE; 
     boolean isDefaultAxis = rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180; 

     int result = CONFIGURATION_ORIENTATION_UNDEFINED; 
     if ((isDefaultAxis && isLand) || (!isDefaultAxis && !isLand)) { 
      result = Configuration.ORIENTATION_LANDSCAPE; 
     } else { 
      result = Configuration.ORIENTATION_PORTRAIT; 
     } 
     return result; 
    } 

    /** 
    * Fires when orientation changes from landscape to portrait and vice versa. 
    * 
    * @param orientation value of {@link Configuration#ORIENTATION_LANDSCAPE} or {@link Configuration#ORIENTATION_PORTRAIT} 
    */ 
    public abstract void onSimpleOrientationChanged(int orientation); 

} 

Zum Festlegen der Kameraausrichtung für die Vorschau.

public static int setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { 
     android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(cameraId, info); 
     int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: 
       degrees = 0; 
       break; 
      case Surface.ROTATION_90: 
       degrees = 90; 
       break; 
      case Surface.ROTATION_180: 
       degrees = 180; 
       break; 
      case Surface.ROTATION_270: 
       degrees = 270; 
       break; 
     } 

     int result; 
     //int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
     // do something for phones running an SDK before lollipop 
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      result = (info.orientation + degrees) % 360; 
      result = (360 - result) % 360; // compensate the mirror 
     } else { // back-facing 
      result = (info.orientation - degrees + 360) % 360; 
     } 

     return result; 

    } 
Verwandte Themen