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

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

时间: 2024-10-31 06:26:59

Android图片实现压缩处理的实例代码的相关文章

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

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

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

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

asp.net输出重写压缩页面文件实例代码

 这篇文章主要介绍了asp.net输出重写压缩页面文件实例代码,需要的朋友可以参考下 例子    代码如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.Web

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

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

关于Android高德地图的简单开发实例代码(DEMO)_Android

废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab

Android 百度地图POI搜索功能实例代码_Android

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

Android自定义水波纹动画Layout实例代码_Android

话不多说,我们先来看看效果: Hi前辈搜索预览 这一张是<Hi前辈>的搜索预览图,你可以在这里下载这个APP查看更多效果: http://www.wandoujia.com/apps/com.superlity.hiqianbei LSearchView 这是一个MD风格的搜索框,集成了ripple动画以及search时的loading,使用很简单,如果你也需要这样的搜索控件不妨来试试:https://github.com/onlynight/LSearchView RippleEverywh

Android AutoCompleteTextView自动提示文本框实例代码_Android

 自动提示文本框(AutoCompleteTextView)可以加强用户体验,缩短用户的输入时间(百度的搜索框就是这个效果). 先给大家展示下效果图,如果大家感觉还不错,请参考实现代码:   最后一张获取文本框里面的值(其实就跟TextView.EditText一样): 首先,在xml中定义AutoCompleteTextView控件: activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/ap

基于BootStrap的图片轮播效果展示实例代码_javascript技巧

先给大家展示下bootstrap图片轮播图,效果如下所示,如果大家感觉效果还不错,请继续往下阅读,参考实现代码. 废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="