这一天过得好快,又到了总结的时间,今天有我喜欢的BLG的比赛,搞快点回去看比赛
首先是昨天的目标完成情况:
1.过螳螂bug
2.看CameraX的文档
3.整理通知权限引导弹窗的逻辑
应该算基本都完成了,大部分时间在核对bug,修复bug也就花了一会
弹窗逻辑简化了一下,X的文档没看,反而去看了BitmapFactory压缩图片尺寸的文章以及部分文档
先总结下工作:
今天主要还是bug的确认。在我看来,我能修的bug都不难,都是需要核对的,比如我今天就主要核对特殊机型展示异常的bug
然后就是毕设推进了一些,直接把git记录拿过来说下:
fix:拉起拍摄界面不拍摄闪退的bug 2024.02.20 19 minutes ago
新增按尺寸裁剪,并将图片改为jpg,大大减小图片体积 2024.02.20 25 minutes ago
使用Glide加载图片(发现需要解决recycleView图片大小问题) 2024.02.20 Today 17:28
我的毕设是Note,虽然很想分享,但毕竟是我一点一点做出来的,有了感情,以后有缘分享吧
那么分享今天的知识
最简单是是闪退的bug,这个bug原因是拍摄的回调没有处理空的问题
然后是Glide,导一个依赖,然后巨简单的用法:Glide.with().load().into()
简单吧,接下来是核心知识
首先看的文章正是霖神的文章(写得真好啊),链接在这:
https://guolin.blog.csdn.net/article/details/9316683?spm=1001.2014.3001.5502
为什么要看这个,是因为我的毕设加入图片后,viewPager切换会很卡顿,我去看了好多的文章,包括用了Glide去实现,但是发现还是卡
然后我可能是通过以前的经验,然后加上自己的直觉?我感觉是图片太大了
然后就找到了霖神的这篇,我只放一段核心代码,其余建议看原文:
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
霖神的文章表示,之所以图片大,是因为它的像素高,实际上用不了那么大的像素,想一想,你用来展示的imageView大小可能只有半个屏幕,结果你设计的图片是一整个屏幕,不卡才怪
但是还是有问题,霖神这个是压缩的资源里的文件,我的图片是来自手机相册或者自己拍摄,操控的直接是Bitmap,这颗咋办
我研究了许久(结合文档),找到了另一台路:
public static Bitmap decodeFile(String pathName, Options opts)
这个path刚好满足我的需求,那么我就稍微修改一下:
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(String pathName,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(pathName,options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(pathName,options);
}
完美,这样刚好可以传入path与options,从而实现剪辑图片
代码跑起来效果是符合预期的,但是还是卡
这次有了经验,我先去看下图片大小
好家伙,还是一张9M
你想想,你recycleView加载的图片一个都几M,他不卡才怪
但是他为啥这么大?
其他的图片咋那么小?
我一看,发现小的图片是jpg,大的都是png,那这俩有啥区别呢?
直接问gpt:
jpg与png有什么区别
JPG(或称JPEG)和PNG是两种常用的图像文件格式,它们的区别主要在于压缩方式、图片质量、支持的颜色数以及是否支持透明度等方面。
压缩方式:JPG采用有损压缩,可以去除图片中的部分细节以减小文件体积,因此通常用于压缩照片或复杂的图像。而PNG采用无损压缩,输出的图像将保留最初图像的所有细节。
图片质量:由于JPG采用有损压缩,当压缩比例增大时,图像质量会有所下降。PNG则可以保持图像的原始质量。
颜色支持:JPG最大支持1,677万种颜色,而PNG在这方面更加强大,PNG-24可以支持约1.67亿种颜色,而PNG-48则是惊人的2.81万亿种颜色。
透明度支持:JPG不支持透明度,但PNG支持,这使得PNG更适合制作带透明度需求的图像。
文件大小:由于JPG的有损压缩,同样质量的图片,JPG的文件大小要小于PNG的文件大小。
总结来说,如果你想保持图像的原始质量,并且需要透明度,那么PNG是更好的选择。而如果你更关注图像的大小,并且可以接受一些细节的丢失,那么JPG可能更适合你。
39.6s
2283 Tokens
果然,我一换,成功不卡了
那么,今天的分享就到这里的,定一下明天计划:
1.看bug
2.看CameraX的文档
3.搞懂Glide加载图片闪烁的问题
老规矩,祝大家天天快乐!