Android之获取本地图片并压缩方法

这两天在做项目时,做到上传图片功能一块时,碰到两个问题,一个是如何获取所选图片的路径,一个是如何压缩图片,在查了一些资料和看了别人写的后总算折腾出来了,在此记录一下。

首先既然要选择图片,我们就先要获取本地所有的图片,Android已经为我们封装好了该意图。

1 Intent intent = new Intent(Intent.ACTION_PICK, null);//从列表中选择某项并返回所有数据
2 intent.setDataAndType(
3                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,//得到系统所有的图片
4                    "image/*");//图片的类型,image/*为所有类型图片
5 startActivityForResult(intent, PHOTO_GALLERY);

然后我们重写onActivityResult方法。

在Android1.5后系统会调用MediaScanner服务进行后台扫描,索引歌曲,图片,视频等信息,并将数据保存在android.provider.MediaStore.Images.Thumbnails 和android.provider.MediaStore.Video.Thumbnails这两个数据库中。

所以我们需要使用Activity.managedQuery(uri, projection, selection, selectionArgs, sortOrder)方法从数据中获取相应数据。

uri:  需要返回的资源索引

projection: 用于标识有哪些数据需要包含在返回数据中。

selection: 作为查询符合条件的过滤参数,类似于SQL语句中Where之后的条件判断。

selectionArgs: 同上。

sortOrder: 对返回信息进行排序。

 1      @Override
 2      protected void onActivityResult(int requestCode, int resultCode, Intent data)
 3      {
 4          switch (requestCode)
 5          {
 6          //请求为获取本地图品时
 7          case PHOTO_GALLERY:
 8          {
 9                 //图片信息需包含在返回数据中
10                 String[] proj ={MediaStore.Images.Media.DATA};
11                 //获取包含所需数据的Cursor对象
12                 @SuppressWarnings("deprecation")
13                 Cursor cursor = managedQuery(data.getData(), proj, null, null, null);
14                 //获取索引
15                 int photocolumn =  cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
16                 //将光标一直开头
17                 cursor.moveToFirst();
18                 //根据索引值获取图片路径
19                 String path = cursor.getString(photocolumn);
20
21
22              break;
23          }
24
25          default:
26              break;
27          }

以上,我们便可取得本地图片路径了,接下来我们队图片进行压缩处理。

 1       //先将所选图片转化为流的形式,path所得到的图片路径
 2       FileInputStream is = new  FileInputStream(path);
 3       //定义一个file,为压缩后的图片
 4       File f = new File("图片保存路径","图片名称");
 5       int size = " ";
 6       Options options = new Options();
 7       options.inSampleSize = size;
 8       //将图片缩小为原来的  1/size ,不然图片很大时会报内存溢出错误
 9       Bitmap image = BitmapFactory.decodeStream(inputStream,null,options);
10
11      is.close();
12
13      ByteArrayOutputStream baos = new ByteArrayOutputStream();
14      image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//这里100表示不压缩,将不压缩的数据存放到baos中
15      int per = 100;
16      while (baos.toByteArray().length / 1024 > 500) { // 循环判断如果压缩后图片是否大于500kb,大于继续压缩
17      baos.reset();// 重置baos即清空baos
18      image.compress(Bitmap.CompressFormat.JPEG, per, baos);// 将图片压缩为原来的(100-per)%,把压缩后的数据存放到baos中
19      per -= 10;// 每次都减少10
20
21      }
22       //回收图片,清理内存
23      if(image != null && !image.isRecycled()){
24          image.recycle();
25          image = null;
26          System.gc();
27          }
28      ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
29      btout.close();
30      FileOutputStream os;
31      os = new FileOutputStream(f);
32      //自定义工具类,将输入流复制到输出流中
33      StreamTransferUtils.CopyStream(btinput, os);
34      btinput.close();
35      os.close();

完成以后,我们可以在指定的图片保存路径下看到压缩的图片。

时间: 2024-08-03 18:01:40

Android之获取本地图片并压缩方法的相关文章

android 获取本地图片(二)

链接上一篇博文 本篇博文接着讲述本地图片的获取. 下面给出获取本地图片的异步线程类LoadLoacalPhotoCursorTask的代码: /** * 获取本地图片的异步线程类 */ public class LoadLoacalPhotoCursorTask extends AsyncTask<Object, Object, Object> { private Context mContext; private final ContentResolver mContentResolver;

android 获取本地图片(一)

我的前面几个博文中已经介绍过了如何获取本地图片和Bitmap.软引用.弱引用的使用方法.在这两个博文当中针对一个完整的Demo示例给大家讲解获取本地图片的非常有效.也是安卓官方推荐的方法. **源代码在博文最后可以下载**. 不知道怎么回事,近来csdn写博文上传图片错误,不能上传图片,所以给不了大家效果图.我就文字介绍好了.整个Demo只有一个Activity中完成,加载本地图片在GridView中进行显示,同时点击每个图片可以对图片进行选中的操作,每个item图片右上角会给出对号的提示,表示

android获取本地图片并显示图片

import java.io.FileNotFoundException; import android.content.ContentResolver; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.util.

Android加载大图片(压缩)

转载自http://blog.csdn.net/junjx/article/details/7798604 在Android开发中,我们经常需要加载图片.但是图片的尺寸往往会很大,如果我们要的是比较小的图片,在Android有限的内存下,我们显然不能把大尺寸的图片放到内存里,这样不但效率降低,而且会导致java.lang.OutOfMemory异常,相信很多朋友都遇到过这样的问题,那么该怎么解决这一问题呢?其实在Android官方文档中早已给出了解决的方案. 一.读Bitmap的尺寸和类型   

Android中获取屏幕长宽的方法

package com.kale.screen; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Point; import android.os.Bundle; import android.util.Log; import android.view.Display; public class MainActivity extends Activity {

URL转Drawable之 Android中获取网络图片的三种方法

转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用线程来实现.下面列三种获取url图片的方法: 1.直接获取:(容易:ANR,不建议) [java] view plain copy mImageView = (ImageView)this.findViewById

Android中获取网络图片的三种方法

android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用线程来实现.下面列三种获取url图片的方法: 1.直接获取:(容易:ANR,不建议) mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ; Drawable drawable = loadImageFromNetwo

Android下获取FPS的几种方法

FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来. Android下获取FPS的方法有很多种,本文将介绍三种最为简单易行的方法.三种方法的共同点是都无需root,兼容性好,但又各具特色. 第一种方法,使用GameBench,它的特点是图表显示,非常直观.相对其他跑分软件,它测出的数据更为客观准确.GameBench只能监测前台应用的FPS,无法获

IOS -- 获取本地图片和网络图片的大小size

// 获取图片的size CGSize size = [UIImage imageNamed:@"regStep2_sex"].size; 获取网络图片的尺寸: // 根据图片url获取图片尺寸 +(CGSize)getImageSizeWithURL:(id)imageURL { NSURL* URL = nil; if([imageURL isKindOfClass:[NSURL class]]){ URL = imageURL; } if([imageURL isKindOfCl