Camera activity falsche Orientierung der Bilder

  • Antworten:8
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 4

09.11.2016 23:48:53 via Website

Hallo liebe AndroidPIT Community,

ich bin neu hier und selbst schon seit längeren am programmieren.
bin dabei eine Kamera app zu programmieren hab damit aber noch einige Probleme.

public class Kamera implements Camera.PictureCallback {

Camera cam;
ClientListener ctx;
int chan;
SurfaceHolder holder;

public void setCameraDisplayOrientation(android.hardware.Camera camera) {
    android.hardware.Camera.CameraInfo camInfo =
    new android.hardware.Camera.CameraInfo();

    Display display = ((WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.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;
    if (camInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        result = (camInfo.orientation + degrees) % 360;
        result = (360 - result) % 360;  // compensate the mirror
    } else {  // back-facing
        result = (camInfo.orientation - degrees + 360) % 360;
    }
    camera.setDisplayOrientation(result);
}

public boolean takePhoto() throws InterruptedException {
    if (!(ctx.getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)))
        return false;

    int cameraId = -1;
    int numberOfCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numberOfCameras; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if(info.facing==Camera.CameraInfo.CAMERA_FACING_BACK){
        Log.i("Kamera", "Found BackCamera, ID:" +i);
        }
        else if(info.facing==Camera.CameraInfo.CAMERA_FACING_FRONT){
        Log.i("Kamera", "Found FrontCamera, ID:" +i);
        }
    }
    try {
        cam = Camera.open(0);
    } catch (Exception e) {
        return false;
    }

    try {
        cam.setPreviewTexture(new SurfaceTexture(10));
    } catch (IOException e1) {
    }
    Parameters params = cam.getParameters();
    params.setPreviewSize(640, 480);
    params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
    params.setPictureFormat(ImageFormat.JPEG);
    params.setJpegQuality(30);

    setCameraDisplayOrientation(cam);

    cam.setParameters(params);
    cam.startPreview();
    cam.takePicture(null, null, null, this);
    return true;
}

}

in meinem code wird leider die Display Orientation nicht richtig eingestellt und somit sind die bilder um 90° gedreht. Habe schon viel im netz gesucht doch leider keine passende Lösung gefunden daher hoffe ich ihr könnt mir weiterhelfen.

Grüße Mike

EDIT:
code Aktualisiert

— geändert am 15.11.2016 21:53:21

Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 6.770

10.11.2016 05:27:30 via App

Hallo Mike,

herzlich willkommen bei uns im Forum (*)

dein Titel war nicht ganz aussagekräftig, daher haben ich diesen etwas angepasst.

Bitte versuche, das nächste Mal, einen aussagekräftigeren Threadtitel zu wählen - lies dir dazu diesen Thread durch.

— geändert am 10.11.2016 05:27:47

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

  • Forum-Beiträge: 2.211

10.11.2016 09:42:53 via Website

Hallo Mike,

ich arbeite zwar nicht mit der Kamera, aber es gib mehrere, die Dein "Problem" haben
http://stackoverflow.com/a/31257857/6337627

Soweit ich das überblicken konnte , ist es auch abhängig von der Activity/Surface-Orientation

— geändert am 10.11.2016 10:06:34

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 4

15.11.2016 21:58:14 via Website

Habe die Letzen tage weiter rumgeschaut und ausprobiert aber leider erfolglos. Console gibt auch keinen fehler aus.

Habe meinen Code Aktualisiert doch leider ohne erfolg,
das aufgenommene Bild ist leider trotzdem um 90° gedreht.

Ich hoffe ihr wisst Rat.

  • Forum-Beiträge: 4

22.11.2016 19:21:54 via Website

Ludy

Hallo Mike,

Bitte nicht pushen - ich bin mir sicher, dass sich hier jemand melden wird, sobald er eine Antwort für dich hat (smug)

Ich hoffe es, wollte nicht direkt pushen aber ist auch knapp eine woche vergangen deswegen hab ich nochmal gefragt gehabt (:

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.305

22.11.2016 22:19:21 via App

Kannst du das Bild nicht im Nachhinein nochmal nachdrehen?
hab den ein Snippet für poste dieses Morgen mal. es ist eigentlich zum Heruntersetzen der Auflösung aber dabei werden die Bilder auch passend gedreht.

LG Pascal //It's not a bug, it's a feature. :) ;)

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.305

23.11.2016 18:22:29 via Website

Vielleicht kannst du damit was anfangen:

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;



/**
 * Created by Pascal on 04.01.2016.
 */
public class PictureTools
{
    /**
     * Resizes a Bitmap, with keeping aspect ratio. Keeping orientation.
     * @param bm Bitmap to scale
     * @param newHeight hight to scale
     * @param newWidth width to scale
     * @param orientation picture orientation
     * @return resized Bitmap
     */
    static Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth, int orientation) {
        int width = bm.getWidth();
        int height = bm.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // create a matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
        if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
            matrix.postRotate(90);
        } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
            matrix.postRotate(270);
        } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
            matrix.postRotate(180);
        } else if (orientation == ExifInterface.ORIENTATION_TRANSPOSE) {
            matrix.postRotate(-90);
        }
        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
        return resizedBitmap;
    }


    public static String resizePicture(String path,Uri selected, int maxWidth, int height) {




       // Bitmap b = BitmapFactory.decodeFile(path);
        try {
           Bitmap bitmap = MediaStore.Images.Media.getBitmap(Tools.ctx.getContentResolver(),selected);


            return resizePicture(bitmap,path,maxWidth,height);


        } catch (Exception e) {
            e.printStackTrace();
            Tools.handleOnFailiure(e);
            Toast.makeText(Tools.ctx,"Error in resizePicture()...",Toast.LENGTH_SHORT).show();
        }

        return "";



    }


    public static final int REQUEST_EXTERNAL_STORAGE = 1; public static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE };
    public static boolean verifyStoragePermissions(Activity activity) {
        // Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
            return  false;
        }
        return true;
    }

    /**
     * Resizes a picture to new size.Keeps the AspectRatio
     *@permission Needs File read/write Permission
     * @param path Path to picture
     * @param maxWidth MaxPictureWidth
     * @param height MaxPictureHight
     * @return Path to resized picture
     */
    public static String resizePicture(Bitmap b,String path, int maxWidth, int height) {

        File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        File pa = new File(path);



        //region getOrientation
        int orientation = 0;
        try {
            ExifInterface exif = new ExifInterface(path);
            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
            int d = orientation;
            String s = String.valueOf(d);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        //endregion


        /// Start calculting new Image size ///

        Bitmap out;

        //region calcAspectRatio
        float rateX = (float) maxWidth / (float) b.getWidth();
        float rateY = (float) height / (float) b.getHeight();

        int W = (int) (b.getWidth() * rateY);
        int H = (int) (b.getHeight() * rateY);
        //endregion

        out = getResizedBitmap(b, H, W, orientation);

        //region getFileName
        String name = pa.getName();
        int pos = name.lastIndexOf(".");
        if (pos > 0) {
            name = name.substring(0, pos);
        }
        name += "_resized.jpg";
        //endregion


        //region saveImage

        File file = new File(dir, name);
        FileOutputStream fOut;
        try {
            fOut = new FileOutputStream(file);
            out.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
            fOut.flush();
            fOut.close();
            b.recycle();
            out.recycle();

        } catch (Exception e) { // TODO
            e.printStackTrace();
            Tools.handleOnFailiure(e);
            return path;
        }
        //endregion

        return String.format("%s/%s", dir.getPath(), name);


    }




}

— geändert am 23.11.2016 18:23:44

LG Pascal //It's not a bug, it's a feature. :) ;)