Android图片压缩方法并压缩到指定大小

发布时间 - 2026-01-11 02:11:46    点击率:

一、图片质量压缩

/** 
   * 质量压缩方法 
   * @param image 
   * @return 
   */  
  public static Bitmap compressImage(Bitmap image) {  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
    int options = 90;  
    while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩  
      baos.reset(); // 重置baos即清空baos  
      image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中  
      options -= 10;// 每次都减少10  
    }  
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中  
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片  
    return bitmap;  
  }  

二、按比例大小压缩 (路径获取图片)

/** 
   * 图片按比例大小压缩方法 
   * @param srcPath (根据路径获取图片并压缩) 
   * @return 
   */  
  public static Bitmap getimage(String srcPath) {  
    BitmapFactory.Options newOpts = new BitmapFactory.Options();  
    // 开始读入图片,此时把options.inJustDecodeBounds 设回true了  
    newOpts.inJustDecodeBounds = true;  
    Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空  
    newOpts.inJustDecodeBounds = false;  
    int w = newOpts.outWidth;  
    int h = newOpts.outHeight;  
    // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
    float hh = 800f;// 这里设置高度为800f  
    float ww = 480f;// 这里设置宽度为480f  
    // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
    int be = 1;// be=1表示不缩放  
    if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放  
      be = (int) (newOpts.outWidth / ww);  
    } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放  
      be = (int) (newOpts.outHeight / hh);  
    }  
    if (be <= 0)  
      be = 1;  
    newOpts.inSampleSize = be;// 设置缩放比例  
    // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
    bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
    return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩  
  }  

三、按比例大小压缩 (Bitmap)

/** 
   * 图片按比例大小压缩方法 
   * @param image (根据Bitmap图片压缩) 
   * @return 
   */  
  public static Bitmap compressScale(Bitmap image) {  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
    // 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出  
    if (baos.toByteArray().length / 1024 > 1024) {  
      baos.reset();// 重置baos即清空baos  
      image.compress(Bitmap.CompressFormat.JPEG, 80, baos);// 这里压缩50%,把压缩后的数据存放到baos中  
    }  
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
    BitmapFactory.Options newOpts = new BitmapFactory.Options();  
    // 开始读入图片,此时把options.inJustDecodeBounds 设回true了  
    newOpts.inJustDecodeBounds = true;  
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
    newOpts.inJustDecodeBounds = false;  
    int w = newOpts.outWidth;  
    int h = newOpts.outHeight;  
    Log.i(TAG, w + "---------------" + h);  
    // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
    // float hh = 800f;// 这里设置高度为800f  
    // float ww = 480f;// 这里设置宽度为480f  
    float hh = 512f;  
    float ww = 512f;  
    // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
    int be = 1;// be=1表示不缩放  
    if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放  
      be = (int) (newOpts.outWidth / ww);  
    } else if (w < h && h > hh) { // 如果高度高的话根据高度固定大小缩放  
      be = (int) (newOpts.outHeight / hh);  
    }  
    if (be <= 0)  
      be = 1;  
    newOpts.inSampleSize = be; // 设置缩放比例  
    // newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565  
    // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
    isBm = new ByteArrayInputStream(baos.toByteArray());  
    bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
    return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩  
    //return bitmap;  
  }  

以上所述是小编给大家介绍的Android图片压缩方法并压缩到指定大小,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# android  # 图片压缩到指定大小  # 图片压缩  # Android实现图片压缩(bitmap的六种压缩方式)  # Android开发之图片压缩实现方法分析  # Android图片压缩几种方式总结  # Android开发实现图片大小与质量压缩及保存  # 按比例  # 其中一个  # 比较多  # 设置为  # 小编  # 清空  # 度高  # 以高  # 在此  # 给大家  # 每次都  # 所述  # 给我留言  # 感谢大家  # 为空  # 疑问请  # 有任何  # isBm  # int  # JPEG 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  如何构建满足综合性能需求的优质建站方案?  bing浏览器学术搜索入口_bing学术文献检索地址  音乐网站服务器如何优化API响应速度?  js实现获取鼠标当前的位置  在centOS 7安装mysql 5.7的详细教程  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  动图在线制作网站有哪些,滑动动图图集怎么做?  Linux系统运维自动化项目教程_Ansible批量管理实战  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel怎么在Blade中安全地输出原始HTML内容  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Bootstrap整体框架之JavaScript插件架构  如何在Windows环境下新建FTP站点并设置权限?  简历没回改:利用AI润色让你的文字更专业  Laravel如何实现文件上传和存储?(本地与S3配置)  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何获取PHP WAP自助建站系统源码?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  如何在IIS中配置站点IP、端口及主机头?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  如何在阿里云虚拟主机上快速搭建个人网站?  如何在建站宝盒中设置产品搜索功能?  北京网站制作的公司有哪些,北京白云观官方网站?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  大学网站设计制作软件有哪些,如何将网站制作成自己app?  长沙做网站要多少钱,长沙国安网络怎么样?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  太平洋网站制作公司,网络用语太平洋是什么意思?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何实现多对多模型关联?(Eloquent教程)  如何用VPS主机快速搭建个人网站?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Android使用GridView实现日历的简单功能  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  如何在搬瓦工VPS快速搭建网站?  详解Android图表 MPAndroidChart折线图  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  手机软键盘弹出时影响布局的解决方法  EditPlus中的正则表达式实战(5)  Android中AutoCompleteTextView自动提示