Android中图片压缩方案详解_第1页
Android中图片压缩方案详解_第2页
Android中图片压缩方案详解_第3页
Android中图片压缩方案详解_第4页
Android中图片压缩方案详解_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android 中图片压缩方案详解中图片压缩方案详解 1 质量压缩法 设置 bitmap options 属性 降低图片的质量 像素不会减少 第一个参数为需要压缩的 bitmap 图片对象 第二个参数为压缩后图片保存的位置 设置 options 属性 0 100 来实现压缩 private Bitmap compressImage Bitmap image ByteArrayOutputStream baos new ByteArrayOutputStream press Bitmap CompressFormat JPEG 100 baos 质量压缩方法 这里 100 表示不压缩 把压缩后的数据存放到 baos 中 int options 100 while baos toByteArray length 1024 100 循环判断如果压缩后图片是否大 于 100kb 大于继续压缩 baos reset 重置 baos 即清空 baos press 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 质量压缩不会减少图片的像素 它是在保持像素不变的前提下改变图片的位深及透明度等 来达到压缩图片的目的 进过它压缩的图片文件大小会有改变 但是导入成 bitmap 后占得 内存是不变的 因为要保持像素不变 所以它就无法无限压缩 到达一个值之后就不会继 续变小了 显然这个方法并不适用于缩略图 其实也不适用于想通过压缩图片减少内存的 适用 仅仅适用于想在保证图片质量的同时减少文件大小的情况而已 2 采样率压缩法 private 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 现在主流手机比较多是 1280 720 分辨率 所以高和宽我们设置为 float hh 1280f 这里设置高度为 1280f float ww 720f 这里设置宽度为 720f 缩放比 由于是固定比例缩放 只用高或者宽其中一个数据进行计算即可 int be 1 be 1 表示不缩放 if w h else if w hh 如果高度高的话根据宽度固定大小缩放 be int newOpts outHeight hh if be size 1024 System out println out toByteArray length matrix setScale 0 9f 0 9f result Bitmap createBitmap result 0 0 result getWidth result getHeight matrix true out reset press Bitmap CompressFormat JPEG 85 out 缩放法其实很简单 设定好 matrix 在 createBitmap 就可以了 但是我们并不知道缩放比 例 而是要求了图片的最终大小 直接用大小的比例来做的话肯定是有问题的 用大小比 例的开方来做会比较接近 但是还是有差距 但是只要再做一下微调应该就可以了 微调 的话就是修改过的图片大小比最终大小还大的话 就进行 0 8 的压缩再比较 循环直到大 小合适 这样就能得到合适大小的图片 而且也能比较保证质量 4 JNI 调用 libjpeg 库压缩 JNI 静态调用 bitherlibjni c 中的方法来实现压缩 Java net bither util NativeUtil compressBitmap net bither util 为包名 NativeUtil 为类名 compressBitmap 为 native 方法名 我们只需要调 用 saveBitmap 方法就可以 bmp 需要压缩的 Bitmap 对象 quality 压缩质量 0 100 fileName 压缩后要保存的文件地址 optimize 是否采用哈弗曼表数据计算 品质相差 5 10 倍 jstring Java net bither util NativeUtil compressBitmap JNIEnv env jobject thiz jobject bitmapcolor int w int h int quality jbyteArray fileNameStr jboolean optimize AndroidBitmapInfo infocolor BYTE pixelscolor int ret BYTE data BYTE tmpdata char fileName jstrinTostring env fileNameStr if ret AndroidBitmap getInfo env bitmapcolor if ret AndroidBitmap lockPixels env bitmapcolor BYTE r g b data NULL data malloc w h 3 tmpdata data int j 0 i 0 int color for i 0 i h i for j 0 j 16 g color b color data b data 1 g data 2 r data data 3 pixelscolor 4 AndroidBitmap unlockPixels env bitmapcolor int resultCode generateJPEG tmpdata w h quality fileName optimize free tmpdata if resultCode 0 jstring result env NewStringUTF env error error NULL return result return env NewStringUTF env 1 success 5 质量压缩 采样率压缩 JNI 调用 libjpeg 库压缩结合使用 首先通过尺寸压缩 压缩到手机常用的一个分辨率 1280 960 微信好像是压缩到这个分辨 率 然后我们要把图片压缩到一定大小以内 比如说 200k 然后通过循环进行质量压缩来计 算 options 需要设置为多少 最后调用 JNI 压缩 计算缩放比 计算缩放比 param bitWidth 当前图片宽度 param bitHeight 当前图片高度 return int 缩放比 public static int getRatioSize int bitWidth int bitHeight 图片最大分辨率 int imageHeight 1280 int imageWidth 960 缩放比 int ratio 1 缩放比 由于是固定比例缩放 只用高或者宽其中一个数据进行计算即可 if bitWidth bitHeight else if bitWidth imageHeight 如果图片高度比宽度大 以高度为基准 ratio bitHeight imageHeight 最小比率为 1 if ratio maxSize 重置 baos 即清空 baos baos reset 每次都减少 10 quality 10 这里压缩 quality 把压缩后的数据存放到 baos 中 press Bitmap CompressFormat JPEG quality baos JNI 保存图片到 SD 卡 这个关键 NativeUtil saveBitmap result quality targetFilePath true 释放 Bitmap if result isRecycled result recycle JNI 图片压缩工具类 package net bither util import android graphics Bitmap import android graphics Bitmap Config import android graphics BitmapFactory import android graphics Canvas import android graphics Matrix import android graphics Rect import android media ExifInterface import java io ByteArrayOutputStream import java io File import java io FileInputStream import java io FileNotFoundException import java io IOException JNI 图片压缩工具类 Description TODO Package net bither util Class NativeUtil public class NativeUtil private static int DEFAULT QUALITY 95 Description JNI 基本压缩 param bit bitmap 对象 param fileName 指定保存目录名 param optimize 是否采用哈弗曼表数据计算 品质相差 5 10 倍 public static void compressBitmap Bitmap bit String fileName boolean optimize saveBitmap bit DEFAULT QUALITY fileName optimize Description 通过 JNI 图片压缩把 Bitmap 保存到指定目录 param image bitmap 对象 param filePath 要保存的指定目录 public static void compressBitmap Bitmap image String filePath 最大图片大小 150KB int maxSize 150 获取尺寸压缩倍数 int ratio NativeUtil getRatioSize image getWidth image getHeight 压缩 Bitmap 到对应尺寸 Bitmap result Bitmap createBitmap image getWidth ratio image getHeight ratio Config ARGB 8888 Canvas canvas new Canvas result Rect rect new Rect 0 0 image getWidth ratio image getHeight ratio canvas drawBitmap image null rect null ByteArrayOutputStream baos new ByteArrayOutputStream 质量压缩方法 这里 100 表示不压缩 把压缩后的数据存放到 baos 中 int options 100 press Bitmap CompressFormat JPEG options baos 循环判断如果压缩后图片是否大于 100kb 大于继续压缩 while baos toByteArray length 1024 maxSize 重置 baos 即清空 baos baos reset 每次都减少 10 options 10 这里压缩 options 把压缩后的数据存放到 baos 中 press Bitmap CompressFormat JPEG options baos JNI 保存图片到 SD 卡 这个关键 NativeUtil saveBitmap result options filePath true 释放 Bitmap if result isRecycled result recycle Description 通过 JNI 图片压缩把 Bitmap 保存到指定目录 param curFilePath 当前图片文件地址 param targetFilePath 要保存的图片文件地址 public static void compressBitmap String curFilePath String targetFilePath 最大图片大小 500KB int maxSize 500 根据地址获取 bitmap Bitmap result getBitmapFromFile curFilePath ByteArrayOutputStream baos new ByteArrayOutputStream 质量压缩方法 这里 100 表示不压缩 把压缩后的数据存放到 baos 中 int quality 100 press Bitmap CompressFormat JPEG quality baos 循环判断如果压缩后图片是否大于 500kb 大于继续压缩 while baos toByteArray length 1024 maxSize 重置 baos 即清空 baos baos reset 每次都减少 10 quality 10 这里压缩 quality 把压缩后的数据存放到 baos 中 press Bitmap CompressFormat JPEG quality baos JNI 保存图片到 SD 卡 这个关键 NativeUtil saveBitmap result quality targetFilePath true 释放 Bitmap if result isRecycled result recycle 计算缩放比 param bitWidth 当前图片宽度 param bitHeight 当前图片高度 return int 缩放比 public static int getRatioSize int bitWidth int bitHeight 图片最大分辨率 int imageHeight 1280 int imageWidth 960 缩放比 int ratio 1 缩放比 由于是固定比例缩放 只用高或者宽其中一个数据进行计算即可 if bitWidth bitHeight else if bitWidth imageHeight 如果图片高度比宽度大 以高度为基准 ratio bitHeight imageHeight 最小比率为 1 if ratio ACTION GET CONTENT 4 4 以下默认打开缩略图 以上打开文件管理器 供选择 选 择图库打开为缩略图页面 选择图片打开为原图浏览 从图库获取到的 uri 格式为 content media external images media 666666 ACTION PICK 都可用 打开默认是缩略图界面 还需要进一步点开查看 参考代码 public void pickFromGallery if Build VERSION SDK INT Build VERSION CODES KITKAT startActivityForResult new Intent Intent ACTION GET CONTENT setType image REQUEST PICK IMAGE else Intent intent new Intent Intent ACTION OPEN DOCUMENT intent addCategory Intent CATEGORY OPENABLE intent setType image startActivityForResult intent REQUEST KITKAT PICK IMAGE 根据 URI 获取对应的文件路径 在我们从图库中选择图片后回调给我们的 data getData 可能是 URI 我们平时对文件的操作 基本上都是基于路径然后进行各种操作与转换 如今我们需要将 URI 对应的文件路径找出 来 具体参考代码如下 public static String getPathByUri Context context Uri data if Build VERSION SDK INT Build VERSION CODES KITKAT DocumentProvider if isKitKat final String split docId split final String type t 0 if primary equalsIgnoreCase type return Environment getExternalStorageDirectory split 1 else if isDownloadsDocument uri DownloadsProvider final String id DocumentsContract getDocumentId uri final Uri contentUri ContentUris withAppendedId Uri parse content downloads public downloads Long valueOf id return getDataColumn context contentUri null null else if isMediaDocument uri MediaProvider final String docId DocumentsContract getDocumentId uri final String split docId split final String type split 0 Uri contentUri null if image equals type contentUri MediaStore Images Media EXTERNAL CONTENT URI else if video equals type contentUri MediaStore Video Media EXTERNAL CONTENT URI else if audio equals type contentUri MediaStore Audio Media EXTERNAL CONTENT URI final String selection id final String selectionArgs new String split 1 return getDataColumn context contentUri selection selectionArgs else if content equalsIgnoreCase uri getScheme MediaStore and general return getDataColumn context uri null null else if file equalsIgnoreCase uri getScheme File return uri getPath return null Get the value of the data column for this Uri This is useful for MediaStore Uris and other file based ContentProviders param context The context param uri The Uri to query param selection Optional Filter used in the query param selectionArgs Optional Selection arguments used in the query return The value of the data column which is typically

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论