一 通过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 是竖屏的 如果你直接对原始图片进行 角度旋转是有问题的。 这是为什么呢?这里就涉及到预览与摄像头的知识了,给大家一遍文章参考一下吧。
如何解决?
比如我的小米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);
}