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

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

 Intent intent = new Intent(Intent.ACTION_PICK, null);//从列表中选择某项并返回所有数据
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,//得到系统所有的图片
"image/*");//图片的类型,image/*为所有类型图片
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: 对返回信息进行排序。

      @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
//请求为获取本地图品时
case PHOTO_GALLERY:
{
//图片信息需包含在返回数据中
String[] proj ={MediaStore.Images.Media.DATA};
//获取包含所需数据的Cursor对象
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(data.getData(), proj, null, null, null);
//获取索引
int photocolumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
//将光标一直开头
cursor.moveToFirst();
//根据索引值获取图片路径
String path = cursor.getString(photocolumn); break;
} default:
break;
}

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

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

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

 

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

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

    import java.io.FileNotFoundException; import android.content.ContentResolver; import android.content ...

  2. Android ImageView显示本地图片

    Android ImageView 显示本地图片 布局文件 <?xml version="1.0" encoding="utf-8"?> <R ...

  3. android 通过uri获取bitmap图片并压缩

    很多人在调用图库选择图片时会在onActivityResult中用Media.getBitmap来获取返回的图片,如下: Uri mImageCaptureUri = data.getData(); ...

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

    转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...

  5. Android下获取FPS的几种方法

    FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来 ...

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

    // 获取图片的size CGSize size = [UIImage imageNamed:@"regStep2_sex"].size; 获取网络图片的尺寸: // 根据图片ur ...

  7. 关于前端使用JavaScript获取base64图片大小的方法

    base64原理 Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0填充,输出字 ...

  8. .net core获取本地Ip地址的方法

    笔记: /// <summary> /// 获取本地Ip地址 /// </summary> /// <returns></returns> public ...

  9. Android 获取本地图片

    MainActivity.java public class RegisterActivity extends AppCompatActivity { private ImageView iv; @O ...

随机推荐

  1. LA 4975

    回文串的题,求最大的双重回文串: 重新复习了一下manacher算法: 代码: #include<cstdio> #include<cstring> #include<a ...

  2. unity Character Controller 点滴

    unity Character Controller  点滴 1.今天在做角色的时候,发现人物跳不起来,原来设置这个属性即可,Step Offset, 这个是台阶的高度,这个值设置的越大,人物爬的越高 ...

  3. QT内置的ICON资源

    QT内置的ICON资源保存在QStyle类里. 可以通过成员函数 QStyle::standardIcon 来获取. 保存的icon有: enum QStyle::StandardPixmap Thi ...

  4. Delphi 在任务栏隐藏程序图标

    Delphi 在任务栏隐藏程序图标 方法一:1.修改工程文件中的“Application.MainFormOnTaskbar := True;”为“Application.MainFormOnTask ...

  5. 项目经验谈---IM新消息界面刷新异常处理记录

    项目中使用到ContentObserver来观察Provider的变化,当对Uri做数据库操作时对应的Provider会发一条Notify消息调用UI上层的ContentChange方法,在这个Con ...

  6. VC6.0 list sort出错

    在STL中,排序是个很重要的话题. 1.algorithm 里的sort()只接收RandomAccessIterator用于像vector,dequeue的排序 2.像set,map,这种关联式容器 ...

  7. removeTask

    SystemUI中,Home键调出小刷子杀最近任务,整个流程从其RecentsPanelView.java开始: public void handleSwipe(View view) { ... // ...

  8. [CA]一个证书两个域名

    一般一个证书是绑定一个Common name,出于某种测试的需要,我们可能要求一个Site的证书可以是针对2个域名的. 操作如下: 1.CA上CMD输入下面命令,回车: Certutil –setre ...

  9. UIView hitTest的原理

    [转自:http://blog.sina.com.cn/s/blog_59fb90df0101ab26.html] UIView 两个方法: - (UIView *)hitTest:(CGPoint) ...

  10. linux 内核驱动加载过程中 向文件系统中的文件进行读写操作

    utils.h 文件: #ifndef __UTILS_H__ #define __UTILS_H__ void a2f(const char *s, ...); #endif utils.c 文件: ...