从相机预览中横向保存的图像

时间:2019-02-02 06:11:28

标签: java android bitmap camera rotation

我的工作我的第一个Android应用程序。它正在使用来自camera1 api的相机预览(我知道它已被弃用,但我找不到易于理解的camera2资源)。

应用程序是非常困难并且是我的上述电平由于照相机API是不容易使用。但是我大部分时间在那里。

我的问题是,我的相机预览总是保存照片上的景观模式,与取向无关。我查了一下,在实现Exif接口,矩阵和位图时遇到了很多麻烦。

这是我当前正在使用的代码。

public static File getPictureFile(int mediaType) {

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Camera App");
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d("Camera App", "Failed to create directory");
            return null;
        }
    }
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;

    if (mediaType == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
    } else {
        return null;
    }

    return mediaFile;
}

public void takePicturePreview() {
    Camera.PictureCallback mPicture = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            File pictureFile = getPictureFile(MEDIA_TYPE_IMAGE);
            if (pictureFile ==null) {
                Log.d(TAG, "Error creating media file, check storage permissions");
                return;
            }

            //ROTATION NEEDS TO OCCUR HERE
            //String filePath = pictureFile.getPath();
            //Bitmap bitmap = BitmapFactory.decodeFile(filePath);


            /*ExifInterface exif = null;
            try {
                exif = new ExifInterface(filePath);
            } catch (IOException e) {
                e.printStackTrace();
            }*/

            //int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
            //Matrix matrix = new Matrix();
            //matrix.postRotate(orientation);

            //bitmap = Bitmap.createBitmap(bitmap, 0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);

            try {
                FileOutputStream fos = new FileOutputStream(pictureFile);
                //bitmap.compress(Bitmap.CompressFormat.JPEG,85,fos);
                fos.write(data);
                fos.close();
            } catch (FileNotFoundException e) {
                Log.d(TAG, "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.d(TAG, "Error accessing file: " + e.getMessage());
            }
        }
    };



    mCamera.takePicture(null, null, mPicture);

}

注释中的所有内容都是我尝试使用的测试代码,但是没有任何效果。因此,我尝试使用BitmapFactory,Exifinterface来获取方向,然后使用矩阵对其进行旋转,然后创建并保存该位图,但是它崩溃了。

在这一点上,整个exifinterace,位图对我来说还不清楚,真的很难理解发生了什么。

任何人都可以给我任何提示或帮助,以允许我的应用以正确的方向保存照片吗?

1 个答案:

答案 0 :(得分:0)

如果使用旧的相机API,则需要在调用Camera.takePicture()之前调用Parameters.setRotation和Camera.setParameters()。

文档包括有关如何获取当前设备方向的示例代码。