Android 本地图片和拍照图片的获取

在Android项目的开发中,很多时候会涉及到图片,比如你可能需要从本地媒体库中找出一张图片作为自己的头像,也许需要拍一张照片作为一个记录保存。这些就需要掌握在Android中如何获取图片资源了。网上有很多关于这方面的代码,本人也是通过网上的代码学习总结来的,现在就贴出一些代码:

从本地获取图片:

                //打开媒体库,进行图片选择

                int REQUEST_CODE_PICK_IMAGE = 1;

                Intent intent = new Intent(Intent.ACTION_PICK);  
                intent.setType("image/*");//相片类型  
                startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);

 

           //处理选择的图片    

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE_PICK_IMAGE){
                // 外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
                ContentResolver resolver = getContentResolver();
                Uri originalUr = data.getData(); // 获得图片的uri

                // 这里开始的第二部分,获取图片的路径:
                String[] proj = { MediaStore.Images.Media.DATA };
                // 好像是android多媒体数据库的封装接口,具体的看Android文档
                Cursor cursor = resolver.query(originalUr, proj, null, null,
                        null);
                // 按我个人理解 这个是获得用户选择的图片的索引值
                int column_index = cursor
                        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                // 将光标移至开头 ,这个很重要,不小心很容易引起越界
                cursor.moveToFirst();
//                // 最后根据索引值获取图片路径
//                imageviewpath = cursor.getString(column_index);
//
//                cursor.close();
//                // imageviewpath = originalUri.getPath();
//                imagefile = new File(imageviewpath);
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(resolver,
                            originalUr);
                    if(bitmap != null){
                        image.setImageBitmap(bitmap);
                    }
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                if(originalUr != null){
                    Log.e("image_uri", originalUr.toString());
                }else{
                    Log.e("image_uri", "null");
                }
                
            }
        }else{
            
        }
    }

 

拍照获得图片:

                //调用摄像头

                int REQUEST_CODE_CAPTURE_CAMEIA = 2;

                Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");     
                startActivityForResult(getImageByCamera, REQUEST_CODE_CAPTURE_CAMEIA);

 

                

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK){
           if(requestCode == REQUEST_CODE_CAPTURE_CAMEIA){
                Uri uri = data.getData(); 
                if(uri != null){
                    Log.e("photo_uri", uri.toString());
                }else{
                    Bundle bundle = data.getExtras();
                    Bitmap bitmap = (Bitmap) bundle.get("data");
                    if(bitmap != null){
                        image.setImageBitmap(bitmap);
   saveImage(bitmap,              Environment.getExternalStorageDirectory().getAbsolutePath()+"/1.jpg");
                    }else{
                        Log.e("photo_uri", "null");
                    }
                }
            }
        }else{
            
        }
    }

 

    /*
     * 将图片保存为文件
     */
    protected void saveImage(Bitmap bitmap,String path){

        new Thread (new Runnable(){

                  try {  
            BufferedOutputStream bos = new BufferedOutputStream(  
                    new FileOutputStream(path, false));  
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);  
            bos.flush();  
            bos.close();  
        } catch (Exception e) {  
            e.printStackTrace();
            Log.e("error", e.toString());
        }

         }).start();   
    }

 

在图片的显示中可能会出现OOM,本人项目中要实现的效果是添加很多图片,然后传到服务器,在每次选择以后都需要显示,本人是使用GridView来进行图片展示的,但在图片的选择展示过程中就出现了内存溢出的问题,解决方法如下:

这个是等比例缩放:
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);width和height是缩放后的大小,true表示过滤,可消除锯齿感。

newBitmap = Bitmap.createBitmap(oldBitmap, 0, 0, width, height, matrix, true);//用距阵的方式缩放

这个是截取图片某部分:
bitmap = Bitmap.createBitmap(bitmap, x, y, width, height);,意思是从(x,y)开始截取width宽和height高大小的图片。

之后再显示bimap,就不会出现OOM了。

 

转载于:https://my.oschina.net/u/2549561/blog/822780

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值