Android图片实现压缩处理的实例代码

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

整理文档,搜刮出一个Android图片实现压缩处理的实例代码,稍微整理精简一下做下分享。

详解:

1.获取本地图片File文件 获取BitmapFactory.Options对象 计算原始图片 目标图片宽高比 计算输出的图片宽高

2.根据宽高比计算options.inSampleSize值(缩放比例 If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory.)得到bitmap位图 根据位图对象获取新的输出位图对象 Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)Creates a new bitmap, scaled from an existing bitmap, whenpossible.

3.获取图片方向调整、失量压缩图片保持在1024kb以下

 //进行大小缩放来达到压缩的目的
 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inJustDecodeBounds = true;
 BitmapFactory.decodeFile(srcImagePath, options);
 //根据原始图片的宽高比和期望的输出图片的宽高比计算最终输出的图片的宽和高

 float srcWidth = options.outWidth;
 float srcHeight = options.outHeight;
 float maxWidth = outWidth;
 float maxHeight = outHeight;
 float srcRatio = srcWidth / srcHeight; //原始图片宽高比
 float outRatio = maxWidth / maxHeight; //目标图片宽高比
 float actualOutWidth = srcWidth;
 float actualOutHeight = srcHeight;
  if (srcWidth > maxWidth || srcHeight > maxHeight) {
   if(srcRatio>outRatio){ //原始宽高比大于目标宽高比
     actualOutWidth = maxWidth;
     actualOutHeight = actualOutWidth / srcRatio;
   }else if(srcRatio<outRatio){ //原始宽高比小于目标宽高比
     actualOutHeight = maxHeight;
     actualOutWidth = actualOutHeight * srcRatio;
   }
 }else{
   actualOutWidth = maxWidth;
   actualOutHeight = maxHeight;
 }

 options.inSampleSize = computSampleSize(options, actualOutWidth, actualOutHeight);
 options.inJustDecodeBounds = false;
 Bitmap scaledBitmap = null;
 try {
   scaledBitmap = BitmapFactory.decodeFile(srcImagePath, options);
 } catch (OutOfMemoryError e) {
   e.printStackTrace();
 }
 if (scaledBitmap == null) {
   return null;
 }

  //生成最终输出的bitmap
 Bitmap actualOutBitmap = Bitmap.createScaledBitmap(scaledBitmap, (int) actualOutWidth, (int) actualOutHeight, true);

 //释放原始位图资源
 if(scaledBitmap!=actualOutBitmap){ //判断目标位图是否和原始位图指向栈目标相同
   scaledBitmap.recycle();
   scaledBitmap = null;
 }

  //处理图片旋转问题
 ExifInterface exif = null;
 try {
   exif = new ExifInterface(srcImagePath);
   int orientation = exif.getAttributeInt(
       ExifInterface.TAG_ORIENTATION, 0);
   Matrix matrix = new Matrix();
   if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
     matrix.postRotate(90);
   } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
     matrix.postRotate(180);
   } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
     matrix.postRotate(270);
   }
   actualOutBitmap = Bitmap.createBitmap(actualOutBitmap, 0, 0,
       actualOutBitmap.getWidth(), actualOutBitmap.getHeight(), matrix, true);
 } catch (IOException e) {
   e.printStackTrace();
   return null;
 }

  //进行有损压缩
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 int options_ = 100;
 actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);//质量压缩方法,把压缩后的数据存放到baos中 (100表示不压缩,0表示压缩到最小)

 int baosLength = baos.toByteArray().length;

 while (baosLength / 1024 > maxFileSize) {//循环判断如果压缩后图片是否大于maxMemmorrySize,大于继续压缩
   baos.reset();//重置baos即让下一次的写入覆盖之前的内容
   options_ = Math.max(0, options_ - 10);//图片质量每次减少10
   actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);//将压缩后的图片保存到baos中
   baosLength = baos.toByteArray().length;
   if (options_ == 0)//如果图片的质量已降到最低则,不再进行压缩
     break;
 }
 actualOutBitmap.recycle();

 //将bitmap保存到指定路径
 FileOutputStream fos = null;
 String filePath = getOutputFileName(srcImagePath);
 try {
   fos = new FileOutputStream(filePath);
   //包装缓冲流,提高写入速度
   BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fos);
   bufferedOutputStream.write(baos.toByteArray());
   bufferedOutputStream.flush();
 } catch (FileNotFoundException e) {
   return null;
 } catch (IOException e) {
   return null;
 } finally {
   if (baos != null) {
     try {
       baos.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
   if (fos != null) {
     try {
       fos.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 }

 //获取位图缩放比例
 private int computSampleSize(BitmapFactory.Options options, float reqWidth, float reqHeight) {
   float srcWidth = options.outWidth;//20
   float srcHeight = options.outHeight;//10
   int sampleSize = 1;
   if (srcWidth > reqWidth || srcHeight > reqHeight) {
     int withRatio = Math.round(srcWidth / reqWidth);
     int heightRatio = Math.round(srcHeight / reqHeight);
     sampleSize = Math.min(withRatio, heightRatio);
   }
   return sampleSize;
 }

压缩比例换算:

float srcWidth = options.outWidth;
float srcHeight = options.outHeight;
float widthScale = outWidth / srcWidth;//目标/原始 宽比例
float heightScale = outHeight / srcHeight; //目标原始 高比
//对比宽高比选择较大的一种比例
float scale = widthScale > heightScale ? widthScale : heightScale;
float actualOutWidth = srcWidth;
float actualOutHeight = srcHeight;
if (scale < 1) {
  actualOutWidth = srcWidth * scale;
  actualOutHeight = srcHeight * scale;
}

设置缩放比例--生成新的位图

  Matrix matrix1 = new Matrix();
  matrix1.postScale(scale, scale);// 放大缩小比例
  //生成最终输出的bitmap
  Bitmap actualOutBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix1, true);

  if (actualOutBitmap != scaledBitmap) {
    scaledBitmap.recycle();
    scaledBitmap = null;
    System.gc();
  }

参考:https://github.com/guizhigang/LGImageCompressor

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android图片压缩处理  # Android图片压缩  # android图片压缩的3种方法实例  # Android拍照得到全尺寸图片并进行压缩  # android 将图片压缩到指定的大小的示例  # Android WebP 图片压缩与传输  # Android实现简单图片压缩的方法  # Android图片压缩以及优化实例  # Android图片压缩(质量压缩和尺寸压缩)  # Android实现图片压缩示例代码  # 大家多多  # 文档  # srcImagePath  # float  # true  # decodeFile  # srcHeight  # outHeight  # srcWidth  # outWidth  # kb  # pre  # java  # inJustDecodeBounds  # class  # brush  # maxWidth  # catch  # OutOfMemoryError  # scaledBitmap 


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


相关推荐: Laravel如何处理和验证JSON类型的数据库字段  Laravel如何创建自定义Facades?(详细步骤)  开心动漫网站制作软件下载,十分开心动画为何停播?  如何为不同团队 ID 动态生成多个独立按钮  如何在IIS7中新建站点?详细步骤解析  Laravel如何自定义错误页面(404, 500)?(代码示例)  如何快速启动建站代理加盟业务?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  phpredis提高消息队列的实时性方法(推荐)  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何生成腾讯云建站专用兑换码?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel怎么为数据库表字段添加索引以优化查询  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  JavaScript如何实现倒计时_时间函数如何精确控制  如何在建站之星网店版论坛获取技术支持?  高防服务器租用如何选择配置与防御等级?  做企业网站制作流程,企业网站制作基本流程有哪些?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Swift中switch语句区间和元组模式匹配  制作旅游网站html,怎样注册旅游网站?  Bootstrap整体框架之CSS12栅格系统  如何快速重置建站主机并恢复默认配置?  黑客入侵网站服务器的常见手法有哪些?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel API资源类怎么用_Laravel API Resource数据转换  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  深圳网站制作培训,深圳哪些招聘网站比较好?  如何基于云服务器快速搭建个人网站?  java中使用zxing批量生成二维码立牌  如何基于PHP生成高效IDC网络公司建站源码?  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】