文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android常见的图片压缩方式有哪些

2023-06-15 02:52

关注

小编给大家分享一下Android常见的图片压缩方式有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

先给出一组数据

原图:width:2976; height:2976
原图实际:--->byte:2299820 Mb:2.19328
质量压缩 size--->:byte:1599831 kb:1562.33496
按比例压缩 size--->:byte:191707 kb:187.21387
鲁班压缩 size--->:byte:143792 kb:140.42188

压缩效果:鲁班压缩 > 按比例压缩 > 质量压缩

1、质量压缩

 public void getBitmap(String imgPath, String outPath) {          BitmapFactory.Options newOpts = new BitmapFactory.Options();          newOpts.inJustDecodeBounds = false;          newOpts.inPurgeable = true;          newOpts.inInputShareable = true;          // Do not compress          newOpts.inSampleSize = 1;          newOpts.inPreferredConfig = Config.RGB_565;          storeImage(bitmap, outPath); //保存图片    }

注意

保存图片

    public static boolean storeImage(Bitmap bitmap, String outPath) throws FileNotFoundException {        FileOutputStream os = new FileOutputStream(outPath);        boolean compressResult = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);        return compressResult;    }

2、按比例压缩(尺寸压缩、采样率压缩)

    public static String compressScale(String path,, String outPath, int targetW, int targetH) throws FileNotFoundException {        // 获取option          BitmapFactory.Options options = new BitmapFactory.Options();        // inJustDecodeBounds设置为true,这样使用该option decode出来的Bitmap是null,          // 只是把长宽存放到option中          options.inJustDecodeBounds = true;        // 此时bitmap为null          Bitmap bitmap = BitmapFactory.decodeFile(path, options);        int inSampleSize = 1; // 1是不缩放          // 计算宽高缩放比例          int inSampleSizeW = options.outWidth / targetW;        int inSampleSizeH = options.outHeight / targetH;        // 最终取大的那个为缩放比例,这样才能适配,例如宽缩放3倍才能适配屏幕,而          // 高不缩放就可以,那样的话如果按高缩放,宽在屏幕内就显示不下了          if (inSampleSizeW > inSampleSizeH) {            inSampleSize = inSampleSizeW;        } else {            inSampleSize = inSampleSizeH;        }        // 一定要记得将inJustDecodeBounds设为false,否则Bitmap为null          options.inJustDecodeBounds = false;        // 设置缩放比例(采样率)          options.inSampleSize = inSampleSize;        bitmap = BitmapFactory.decodeFile(path, options);        boolean isSuccess = storeImage(bitmap, outPath);        if (isSuccess) {            return outPath;        }        return "";    }

这种方法是设置图片的采样率,降低图片像素,通过缩放图片像素来减少图片大小。

那么我又是如何来获取图片压缩前后的大小的呢?

注意:这里的图片的大小是指图片的实际大小,不是bitmap在内存中所占的大小,看压缩效果,就得看图片在文件中所占的大小。

    public static int getFileSize(String imgPath) {        int size = 0;        try {            FileInputStream fis = new FileInputStream(new File(imgPath));            size = fis.available();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return size;    }

3、鲁班压缩(推荐)

鲁班压缩是根据一种算法得出来的,压缩效果基本上和微信一致,差不多在200k以内,图片不失真。

鲁班压缩:
https://github.com/Curzibn/Luban

build.gradle添加依赖

compile 'top.zibin:Luban:1.1.3'
private void lunBanPress(String path) {        String pressPath = Environment.getExternalStorageDirectory().getPath();        Luban.with(this)                .load(path)                                   // 传人要压缩的图片列表                .ignoreBy(100)                                  // 忽略不压缩图片的大小                .setTargetDir(pressPath)                        // 设置压缩后文件存储位置                .setCompressListener(new OnCompressListener() { //设置回调                    @Override                    public void onStart() {                        // TODO 压缩开始前调用,可以在方法内启动 loading UI                        Log.i(TAG, "onStart:开始鲁班压缩 ");                    }                    @Override                    public void onSuccess(File file) {                        // TODO 压缩成功后调用,返回压缩后的图片文件                        Glide.with(activity).load(file).into(iv2);                        Log.i(TAG, "onSuccess: 鲁班压缩成功 :");                        try {                            int size = new FileInputStream(file).available();                            Log.i("tag", "鲁班压缩 size--->:" + "byte:" + size + "    kb:"                                    + (float) size / 1024);                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                    @Override                    public void onError(Throwable e) {                        // TODO 当压缩过程出现问题时调用                        Log.i(TAG, "onError: 鲁班压缩出错");                    }                }).launch();    //启动压缩    }

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

看完了这篇文章,相信你对“Android常见的图片压缩方式有哪些”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯