android bitmap compress

android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片。
有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小。减少图片的大小有两种方法,1. 照小图片; 2. 压缩大图片。 照相时获取小图片一般不太符合要求,因为,图片的清晰度会很差,但是这种情况有个好处就是应用速度会快些; 压缩图片,就是把大图片压缩小,降低图片的质量,在一定范围内,降低图片的大小,并且满足需求(图片仍就清晰)。下面组要是介绍图片的压缩:
 
1. 照相请查看http://blog.csdn.net/luhuajcdd/article/details/8826587 ->想要保存图片到制定目录,启动Camera应用时,需要指定文件
2. 压缩过程:
    2.1 从图片路径中读取图片(图片很大,不能全部加在到内存中处理,要是全部加载到内存中会内存溢出)
  1. final BitmapFactory.Options options = new BitmapFactory.Options();
  2. options.inJustDecodeBounds = true;
  3. BitmapFactory.decodeFile(filePath, options);
  4. // Calculate inSampleSize
  5. options.inSampleSize = calculateInSampleSize(options, 480, 800);
  6. // Decode bitmap with inSampleSize set
  7. options.inJustDecodeBounds = false;
  8. Bitmap bm = BitmapFactory.decodeFile(filePath, options);

2.2 处理图片旋转

  1. int degree = readPictureDegree(filePath);
  2. bm = rotateBitmap(bm,degree) ;
  1. private static int readPictureDegree(String path) {
  2. int degree  = 0;
  3. try {
  4. ExifInterface exifInterface = new ExifInterface(path);
  5. int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
  6. switch (orientation) {
  7. case ExifInterface.ORIENTATION_ROTATE_90:
  8. degree = 90;
  9. break;
  10. case ExifInterface.ORIENTATION_ROTATE_180:
  11. degree = 180;
  12. break;
  13. case ExifInterface.ORIENTATION_ROTATE_270:
  14. degree = 270;
  15. break;
  16. }
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. return degree;
  21. }
  1. private static Bitmap rotateBitmap(Bitmap bitmap, int rotate){
  2. if(bitmap == null)
  3. return null ;
  4. int w = bitmap.getWidth();
  5. int h = bitmap.getHeight();
  6. // Setting post rotate to 90
  7. Matrix mtx = new Matrix();
  8. mtx.postRotate(rotate);
  9. return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
  10. }

2.3压缩图片

  1. bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);//30 是压缩率,表示压缩70%; 如果不压缩是100,表示压缩率为0
 
完整的方法代码:
  1. public static Bitmap getSmallBitmap(String filePath) {
  2. final BitmapFactory.Options options = new BitmapFactory.Options();
  3. options.inJustDecodeBounds = true;
  4. BitmapFactory.decodeFile(filePath, options);
  5. // Calculate inSampleSize
  6. options.inSampleSize = calculateInSampleSize(options, 480, 800);
  7. // Decode bitmap with inSampleSize set
  8. options.inJustDecodeBounds = false;
  9. Bitmap bm = BitmapFactory.decodeFile(filePath, options);
  10. if(bm == null){
  11. return  null;
  12. }
  13. int degree = readPictureDegree(filePath);
  14. bm = rotateBitmap(bm,degree) ;
  15. ByteArrayOutputStream baos = null ;
  16. try{
  17. baos = new ByteArrayOutputStream();
  18. bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);
  19. }finally{
  20. try {
  21. if(baos != null)
  22. baos.close() ;
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. return bm ;
  28. }
  1. private static int calculateInSampleSize(BitmapFactory.Options options,
  2. int reqWidth, int reqHeight) {
  3. // Raw height and width of image
  4. final int height = options.outHeight;
  5. final int width = options.outWidth;
  6. int inSampleSize = 1;
  7. if (height > reqHeight || width > reqWidth) {
  8. // Calculate ratios of height and width to requested height and
  9. // width
  10. final int heightRatio = Math.round((float) height
  11. / (float) reqHeight);
  12. final int widthRatio = Math.round((float) width / (float) reqWidth);
  13. // Choose the smallest ratio as inSampleSize value, this will
  14. // guarantee
  15. // a final image with both dimensions larger than or equal to the
  16. // requested height and width.
  17. inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio;
  18. }
  19. return inSampleSize;
  20. }

android bitmap compress(图片压缩)的更多相关文章

  1. [Android算法] bitmap 将图片压缩到指定的大小

    Bitmap压缩到指定大小: private void imageZoom() {//图片允许最大空间 单位:KBdouble maxSize =400.00;//将bitmap放至数组中,意在bit ...

  2. Bitmap之compress图片压缩

    package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...

  3. Android中的图片压缩

    1.android中计算图片占用堆内存的kB大小跟图片本身的kB大小无关,而是根据图片的尺寸来计算的. 比如一张 480*320大小的图片占用的堆内存大小为: 480*320*4/1024=600kB ...

  4. 有关Option.inSamplSize 和 Compress 图片压缩

    1.图片占用内存:占用的内存 = 图片长度 * 图片宽度 * 单位像素占用的字节数 注: 图片长度和图片宽度就是图片在行列上的像素数量. 图片格式: ALPHA_8:表示8位Alpha位图,即A=8, ...

  5. Android笔记(七十五) Android中的图片压缩

    这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...

  6. Android学习之图片压缩,压缩程度高且失真度小

    曾经在做手机上传图片的时候.直接获取相机拍摄的原图上传,原图大小一般1~2M.因此上传一张都比較浪费资源,有些场景还须要图片多张上传,所以近期查看了好多前辈写的关于图片处理的资料.然后试着改了一个图片 ...

  7. android bitmap compress

    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片. 有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量 ...

  8. Android 简单介绍图片压缩和图片内存缓存

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工, ...

  9. Android 中图片压缩分析(上)

    作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情 ...

随机推荐

  1. 在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器

    Microsoft Visual Studio 2010 提供了一个可用于生成事件接收器的项目类型,事件接收器会在 Microsoft SharePoint 2010 网站上选择事件之前或之后执行操作 ...

  2. oc知道经纬度求位置

    CLLocation *newLocation = [locations lastObject]; CLGeocodeCompletionHandler handler = ^(NSArray *pl ...

  3. [实用]DNS解析命令,静静地学会【转载】

    [实用]DNS解析命令,静静地学会 2016-08-04 06:50 一.Windows下的nslookup 简单的查某个域名,那就nslookup toutiao.com,上面是dns地址,下面是解 ...

  4. vb6 控件未注册问题解决

    打开项目时弹出如题错误. 另附一个帖子:http://bbs.csdn.net/topics/390580540,这个帖子讨论的不错,可以提供很多思路. 解决办法:http://rewwensoftw ...

  5. jmx additional port

    http://stackoverflow.com/questions/20884353/why-java-opens-3-ports-when-jmx-is-configured http://blo ...

  6. reactor与proactor模式

    在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步. 同步和异步是针对应用程序和内核的交互而言的. 同步是指用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 ...

  7. 转 [分享一个SQL] 查会话阻塞关系,层次关系.

    with ash as (select /*+ materialize*/* from DBA_HIST_ACTIVE_SESS_HISTORY  where sample_time between ...

  8. Python定制类

    https://docs.python.org/3/reference/datamodel.html#special-method-names

  9. 在WIN7/8下把XP装入VHD (上)

    系统平台:win8.1 操作目的:工作中需要使用一个只能在winxp下运行的软件,但我平时都用win8.1,也不想弄个麻烦的双系统.在无忧论坛研究了两天后找到个比较好的办法,在VHD里装个window ...

  10. Objective-C相关Category的收集

    Objective-C相关Category的收集 Categories是给你得不到源码的classes增加功能的一种方法.这个页面收集一些相关的Category,并且持续更新,你可以订阅关注.作者是F ...