Android之获取本地图片并压缩方法
2014-11-26 11:20
381 查看
这两天在做项目时,做到上传图片功能一块时,碰到两个问题,一个是如何获取所选图片的路径,一个是如何压缩图片,在查了一些资料和看了别人写的后总算折腾出来了,在此记录一下。
首先既然要选择图片,我们就先要获取本地所有的图片,Android已经为我们封装好了该意图。
然后我们重写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: 对返回信息进行排序。
以上,我们便可取得本地图片路径了,接下来我们队图片进行压缩处理。
完成以后,我们可以在指定的图片保存路径下看到压缩的图片。
首先既然要选择图片,我们就先要获取本地所有的图片,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之获取本地图片并压缩方法
- Android之获取本地图片并压缩方法
- Android获取本地相册图片和拍照获取图片的实现方法
- 关于Android开发保存bitmap获取图片到本地方法
- Android图片压缩和获取压缩后的图片的方法
- android 获取本地sd卡图片,拍照获取图片的方法
- Android开发获取本地图片的一种方法
- Android ImageUtils 图片工具类,包括:小米从相册调图像空指针,三星旋转照片,压缩图片,保存Bitmap到本地,获取本地视频的缩略图,毛化玻璃效果,代码以后会更新
- Android远程图片获取和本地缓存
- Android 之 远程图片获取和本地缓存
- Android 之 远程图片获取和本地缓存
- Android 获取网络图片方法
- Android 之 远程图片获取和本地缓存
- android图片压缩方法
- Android中获取网络图片的三种方法
- Android:指定分辨率和清晰度的图片压缩方法源码
- Android 远程图片获取和本地缓存(三)
- Android 远程图片获取和本地缓存
- Android 之 远程图片获取和本地缓存
- android图片压缩方法