Android进阶之旅(第四天:BitmapFactory压缩图片尺寸)

这一天过得好快,又到了总结的时间,今天有我喜欢的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加载图片闪烁的问题

老规矩,祝大家天天快乐!

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值