您的位置:首页 > 移动开发 > Android开发

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

2017-01-11 00:00 399 查看
在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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息