三 camerax 拍照的数据是字节流 如何控制图片的大小与方向

437 阅读2分钟

一 通过camerax 实现基本的拍照、屏幕曝光度 闪光灯 放大 聚焦等功能

二 通过重力感应实现了横竖屏拍照

三 camerax 拍照的数据是字节流 如何控制图片的大小与方向

四 感悟与展望

动动手实验一下

看过我camerax系列前二篇文章的兄弟们,你们把我重力感应的代码注释掉。

CameraxFragmentV2中 把mMyOrientationDetector.enable()注释就行。 然后分别在华为(p40 鸿蒙系统) 小米(小米11 android11)手机上竖屏拍照,在文件管理中 /storage/emulated/0/Android/data/cn.zdq.mvvm_demo/files

1、 src开头的图片是原始图片(src.jpg)

2、uncompress目录下是对原始图片进行了宽高控制和角度旋转(operetion.jpg)

3、compress是对宽高控制和角度旋转的图片进行压缩(compresss.jpg)

预览与摄像头角度引发的问题

竖屏拍照我们可以发现在小米上原始图片src.jpg 是竖屏的 如果你直接对原始图片进行 角度旋转是有问题的。 这是为什么呢?这里就涉及到预览与摄像头的知识了,给大家一遍文章参考一下吧。

blog.csdn.net/u010126792/…

如何解决?

比如我的小米11 竖屏拍照 预览角度是跟我们肉眼看到的角度是一样的,但是摄像头其实是横屏的,我们点击拍照后 图片其实是逆时针旋转了90°。 在ImageUtil 工具类中 读取图片文件的角度 然后在旋转中加上这个角度值就能正常的旋转了。

 * 读取照片旋转角度
 */
public static 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;
}

注意Matrix的坑点

ImageUtil类中 Matrix 要用postScale与postRotate才能实现缩放与旋转 setScale与setRotate只有后面的代码才会生效

/**
 * Bitmap等比缩放和旋转
 */
public static Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight, int angle) {
    // 获得图片的宽高
    int width = bm.getWidth();
    int height = bm.getHeight();
    //获取原始图片的宽高中的最大值 跟 设置宽高的最大值 进行比例缩放
    int srcMax = Math.max(width, height);
    int targetMax = Math.max(newWidth, newHeight);
    // 计算缩放比例
    float ratio = ((float) targetMax) / srcMax;
    // 取得想要缩放的matrix参数
    Matrix matrix = new Matrix();
    matrix.postScale(ratio, ratio);
    //修复图片被旋转的角度
    matrix.postRotate(angle);
    // 得到新的图片
    return Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
}