content: package com.jingewenku.abrahamcaijin.commonutil;
  
  import android.graphics.Bitmap;
  import android.graphics.Bitmap.Config;
  import android.graphics.Canvas;
  import android.graphics.Rect;
  
  import java.io.ByteArrayOutputStream;
  
  /**
   * 主要功能:JNI图片压缩工具类
   *
   * @Prject: CommonUtilLibrary
   * @Package: com.jingewenku.abrahamcaijin.commonutil
   * @author: AbrahamCaiJin
   * @date: 2017年05月03日 16:30
   * @Copyright: 个人版权所有
   * @Company:
   * @version: 1.0.0
   */
  
  public class AppNativeImageMgr {
  
  //ThumbnailUtils系统工具类的使用
  /*创建一张视频的缩略图。如果视频已损坏或者格式不支持可能返回null。
  filePath：视频文件路径
  kind：文件种类，可以是 MINI_KIND 或 MICRO_KIND
  
  Bitmap createVideoThumbnail(String filePath, int kind)
  创建所需尺寸居中缩放的位图。
  source： 需要被创造缩略图的源位图对象
  width：　生成目标的宽度
  height： 生成目标的高度
  options：在缩略图抽取时提供的选项
  
  Bitmap extractThumbnail(Bitmap source, int width, int height, int options)
  创建所需尺寸居中缩放的位图。
  source： 需要被创造缩略图的源位图对象
  width：　生成目标的宽度
  height： 生成目标的高度
  
  Bitmap extractThumbnail(Bitmap source, int width, int height)
  最后当然要奉上源码了，源码中封装了参考网上的拍照和选取图片工具类，有问题可以指出，共同进步!
  
  原文链接：http://www.jianshu.com/p/e9e1db845c21
  著作权归作者所有，转载请联系作者获得授权，并标注“简书作者”。*/
  
      private static int DEFAULT_QUALITY = 95;
  
      /**
       * @Description: JNI基本压缩
       * @param bit
       *            bitmap对象
       * @param fileName
       *            指定保存目录名
       * @param optimize
       *            是否采用哈弗曼表数据计算 品质相差5-10倍
       * @author XiaoSai
       * @date 2016年3月23日 下午6:32:49
       * @version V1.0.0
       */
      public static void compressBitmap(Bitmap bit, String fileName, boolean optimize) {
          saveBitmap(bit, DEFAULT_QUALITY, fileName, optimize);
      }
  
      /**
       * @Description: 通过JNI图片压缩把Bitmap保存到指定目录
       * @param image
       *            bitmap对象
       * @param filePath
       *            要保存的指定目录
       * @author XiaoSai
       * @date 2016年3月23日 下午6:28:15
       * @version V1.0.0
       */
      public static void compressBitmap(Bitmap image, String filePath) {
          // 最大图片大小 100KB
          int maxSize = 100;
          // 获取尺寸压缩倍数
          int ratio = AppNativeImageMgr.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;
          result.compress(Bitmap.CompressFormat.JPEG, options, baos);
          // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
          while (baos.toByteArray().length / 1024 > maxSize) {
              // 重置baos即清空baos
              baos.reset();
              // 每次都减少10
              options -= 10;
              // 这里压缩options%，把压缩后的数据存放到baos中
              result.compress(Bitmap.CompressFormat.JPEG, options, baos);
          }
          // JNI调用保存图片到SD卡 这个关键
          AppNativeImageMgr.saveBitmap(result, options, filePath, true);
          // 释放Bitmap
          if (result != null && !result.isRecycled()) {
              result.recycle();
              result = null;
          }
      }
  
      /**
       * 计算缩放比
       *
       * @Description:函数描述
       * @param bitWidth
       *            当前图片宽度
       * @param bitHeight
       *            当前图片高度
       * @return
       * @author XiaoSai
       * @date 2016年3月21日 下午3:03:38
       * @version V1.0.0
       */
      public static int getRatioSize(int bitWidth, int bitHeight) {
          // 图片最大分辨率
          int imageHeight = 1280;
          int imageWidth = 960;
          // 缩放比
          int ratio = 1;
          // 缩放比,由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
          if (bitWidth > bitHeight && bitWidth > imageWidth) {
              // 如果图片宽度比高度大,以宽度为基准
              ratio = bitWidth / imageWidth;
          } else if (bitWidth < bitHeight && bitHeight > imageHeight) {
              // 如果图片高度比宽度大，以高度为基准
              ratio = bitHeight / imageHeight;
          }
          // 最小比率为1
          if (ratio <= 0)
              ratio = 1;
          return ratio;
      }
  
      /**
       * 调用native方法
       * @Description:函数描述
       * @param bit
       * @param quality
       * @param fileName
       * @param optimize
       * @author XiaoSai
       * @date 2016年3月23日 下午6:36:46
       * @version V1.0.0
       */
      private static void saveBitmap(Bitmap bit, int quality, String fileName, boolean optimize) {
          compressBitmap(bit, bit.getWidth(), bit.getHeight(), quality, fileName.getBytes(), optimize);
      }
  
      /**
       * 调用底层 bitherlibjni.c中的方法
       * @Description:函数描述
       * @param bit
       * @param w
       * @param h
       * @param quality
       * @param fileNameBytes
       * @param optimize
       * @return
       * @author XiaoSai
       * @date 2016年3月23日 下午6:35:53
       * @version V1.0.0
       */
      private static native String compressBitmap(Bitmap bit, int w, int h, int quality, byte[] fileNameBytes,
          boolean optimize);
      /**
       * 加载lib下两个so文件
       */
      static {
          System.loadLibrary("jpegbither");
          System.loadLibrary("bitherjni");
      }
  }
  