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

整理文档,搜刮出一个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

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

(0)

相关推荐

  • android图片压缩的3种方法实例

    android 图片压缩方法: 第一:质量压缩法: 复制代码 代码如下: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中        int op

  • Android WebP 图片压缩与传输

    1. 简介 直到4g时代,流量依然是宝贵的东西.而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题. 我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的图片同时体积还不能太大. 走在时代前列的谷歌给出了一个不错的答案--WebP. WebP是一种图片文件格式,在相同的压缩指标下,webp的有损压缩能比jpg小 25-34%.而在我自己的测试里,有时候能小50%. 2. 大企业背书 WebP在2010年发布第一个版本,到现在已经6年

  • Android拍照得到全尺寸图片并进行压缩

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <

  • Android实现图片压缩示例代码

    核心思想是通过BitmapFactory.Options来缩放图片,主要是用到了它的inSampleSize参数(采样率) 当inSampleSize为1的时候,采样后的图片大小为图片的原始大小: 当inSampleSize为2的时候,采样后的图片的宽和高是原来的1/2,也就是说,它的像素点是原来的1/4,占的内存自然就是原来的1/4了.以此类推. 当inSampleSize小于1的时候,效果和等于1的时候是一样的. 压缩流程如下: 1.BitmapFactory.Options 的inJust

  • Android图片压缩以及优化实例

    前言 图片压缩在Android技术中已经属于烂大街,上周看了2个开源库然后对自己项目的压缩做了对比,发现一些新东西,记录与此. 为何要压缩 1.体积的原因 如果你的图片是要准备上传的,那动辄几M的大小肯定不行的,况且图片分辨率大于设备分辨率的话毫无意义. 2.内存原因 如果图片要显示下Android设备上,ImageView最终是要加载Bitmap对象的,就要考虑单个Bitmap对象的内存占用了,如何计算一张图片的加载到内存的占用呢?其实就是所有像素的内存占用总和: bitmap内存大小 = 图

  • Android图片压缩(质量压缩和尺寸压缩)

    在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图. 两种方法都实装在了我的项目中,结果却发现在质量压缩的模块中,本来1.9M的图片压缩后反而变成3M多了,很是奇怪,再做了进一步调查终于知道原因了.下面这个博客说的比较清晰: android图片压缩总结 总 结来看,图片有三种存在形式:硬盘上时是

  • Android实现简单图片压缩的方法

    本文实例讲述了Android实现简单图片压缩的方法.分享给大家供大家参考,具体如下: 在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图

  • android 将图片压缩到指定的大小的示例

    从网上收集后自己写的一个方法: 1.首先是一个根据分辨率压缩的类,首先对图片进行一次压缩 /** * 根据分辨率压缩图片比例 * * @param imgPath * @param w * @param h * @return */ private static Bitmap compressByResolution(String imgPath, int w, int h) { BitmapFactory.Options opts = new BitmapFactory.Options();

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

    整理文档,搜刮出一个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 i

  • Android 图片选择详解及实例代码

     Android 图片选择 可以达到的效果: 1.第一个图片的位置放照相机,点击打开照相机 2.其余的是显示全部存储的图片,点击一次是查看大图,长按则是每张图片出现一个checkBox,可以进行选择 下面是实例效果图 MainActivity 类 public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickLis

  • Android中使用七牛云存储进行图片上传下载的实例代码

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了. 可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端

  • Android长按imageview把图片保存到本地的实例代码

    工具类 之前用 AsyncTask 现在改用rxJava public class SaveImageUtils { public static void imageSave(final ImageView imageView, final int id) { Observable .create(new Observable.OnSubscribe<ImageView>() { @Override public void call(Subscriber<? super ImageVie

  • Android 图片的三级缓存机制实例分析

    Android 图片的三级缓存机制实例分析 当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展.为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进行: (1)从缓存中获取图片 (2)从本地的缓存目录中获取图片,并且获取到之后,放到缓存中 (3)从网络去下载图片,下载完成之后,保存到本地和放到缓存中 很好的协调这三层图片缓存就可以大幅度提升应用的性能和用户体验. 快速实现三级缓存的工具类ImageCac

  • python使用pil进行图像处理(等比例压缩、裁剪)实例代码

    PIL中设计的几个基本概念 1.通道(bands):即使图像的波段数,RGB图像,灰度图像 以RGB图像为例: >>>from PIL import Image >>>im = Image.open('*.jpg') # 打开一张RGB图像 >>>im_bands = im.g etbands() # 获取RGB三个波段 >>>len(im_bands) >>>print im_bands[0,1,2] # 输出RG

  • android开发仿ios的UIScrollView实例代码

    今天重新装了编译器,结果崩无极限,真是日了狗了了.刚刚才知道问题在哪边. 好了,说正事,对于ios开发我没接触,不是很了解,百度了半天,差不多就是UIScrollView的把.如果不对,请指证.具体什么效果呢,我刚才拿朋友的iphone手机看了下,iphone的设置界面,第一个列表往下拉可以继续滚,上拉同理.不过android好像没有自带的这种情况. 我把这种效果称为滚无极限的scollview. 下面就来上源码: 首先,最最最重要的就是判断当前视图是否为空,你空视图滚不滚好像没啥区别,除了an

  • Android不规则封闭区域填充色彩的实例代码

    一.概述 在上一篇的叙述中,我们通过图层的方式完成了图片颜色的填充(详情请戳:Android不规则图像填充颜色小游戏),不过在着色游戏中更多的还是基于边界的图像的填充.本篇博客将详细描述. 图像的填充有2种经典算法. 一种是种子填充法. 种子填充法理论上能够填充任意区域和图形,但是这种算法存在大量的反复入栈和大规模的递归,降低了填充效率. 另一种是扫描线填充法. 注意:实际上图像填充的算法还是很多的,有兴趣可以去Google学术上去搜一搜. ok,下面先看看今天的效果图: ok,可以看到这样的颜

  • 基于JS实现前端压缩上传图片的实例代码

    具体代码如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>前端压缩上传图片</title> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> </head> <body>

  • Android实现商城购物车功能的实例代码

    最近公司项目做商城模块,需要实现购物车功能,主要实现了单选.全选,金额合计,商品删除,商品数量加减等功能,先看看效果图: 在这里插入图片描述 一.实现步骤: 0.添加依赖库 1.购物车主界面布局文件(activity_main.xml) 2.购物车实现逻辑主界面(MainActivity.class) 3.使用ExpandableListView,继承BaseExpandableListAdapter 4.购物车数据的bean类(ShoppingCarDataBean.class) 5.分店铺实

随机推荐