首先是最基本的调用图库获取图像的代码。我直接贴出来。也是当个笔记吧。事实是我记不下来。。。

先是调用系统图库

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra("crop", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, 2);

然后是获取选择到得图片的uri

protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {if (requestCode == 2) {Uri uri = data.getData();ContentResolver cr = this.getContentResolver();try {Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));} catch (FileNotFoundException e) {e.printStackTrace();}}}
}

这样就获取到图片了。But。。现在手机都那么好。随随便便一张照片就十几MB、秒秒钟OOM报错呀。

所以接下来我就改了改代码。

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;//指定加载图片方式为只加载头信息
BitmapFactory.decodeStream(cr.openInputStream(uri), null, opts);//将头信息加载到opts中
//3.计算缩放比例
double dx = opts.outWidth/300.0;
double dy = opts.outHeight/300.0;
int scale = 1;
if(dx>dy&&dy>1){System.out.println("按照水平方法缩放,缩放比例:"+dx);scale = (int)(dx+0.5);
}
if(dy>dx&&dx>1){System.out.println("按照垂直方法缩放,缩放比例:"+dy);scale = (int)(dy+0.5);
}
//4.缩放加载图片到内存。
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;//真正的去解析这个位图。
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, opts);

这段代码主要是利用图片前面都会带有一段信息是图片信息的。第一次加载仅仅是加载头信息。获取到图片的宽高后再根据宽高来设置缩放比例。以避免OOM

But。这有有问题了。这样缩放是等比缩放。然后头像一般都是正方形的。然而我帅气的自拍是长方形的呀。我处女座就不能忍那两边留有的空白了。

于是我默默地弄了两种处理方式:

1.拉伸。。。

就是吧图片拉伸成正方形

int width = bitmap.getWidth();
int height = bitmap.getHeight();
// 计算缩放比例
float scaleWidth = ((float) 300) / width;
float scaleHeight = ((float) 300) / height;
// 取得想要缩放的matrix参数
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);

写好测试后我立马就疯了。这拉伸。哎。不能放在头像功能这。把我帅气的自拍弄得太丑了。简直不能忍,

2.截取部分图片。

int width = bitmap.getWidth();
int height = bitmap.getHeight();
if (width>height){Bitmap bitmap = Bitmap.createBitmap(bitmap,(width-height)/2,0,height,height);
}else {Bitmap bitmap = Bitmap.createBitmap(bitmap,0,(height-width)/2,width,width);
}

这样就成功从图片中间截取正方形部分出来了。恩。爽多了。其实这个功能可以改改的。让用户自己从图片上选取正方形部分出来。昂。我是想可以这么做的。But。还没这么干。回头写好了再贴出来吧。

PS:以上观点仅仅是作者自己的想法。如果有更好的处理方案什么的。欢迎各位指出。谢谢谢谢谢、

关于开发Android应用时写从图库选择头像功能时遇到的一些问题。相关推荐

  1. Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能

    支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几 ...

  2. Android中调用另一个Activity并返回结果-以模拟选择头像功能为例

    场景 Android中点击按钮启动另一个Activity以及Activity之间传值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  3. Android 三星手机拍照,从图库选择照片旋转问题完美解决

    好久没有写博客了,最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok没有问题,唯独三星的手机拍照之后,你会很清楚 ...

  4. android添加截图功能,Android应用开发之Android 5.0及以上编程实现屏幕截图功能的方法...

    本文将带你了解Android应用开发Android 5.0及以上编程实现屏幕截图功能的方法,希望本文对大家学Android有所帮助. 本文实例讲述了Android   5.0及以上编程实现屏幕截图功能 ...

  5. android studio放置在函数上面看_像写Flutter一样开发Android原生应用

    要问到Flutter和Android原生App,在开发时有何区别,编程方式是绕不开的话题.Flutter采用声明式编程,Android原生开发则采用命令式编程. 声明式编程 VS. 命令式编程 我们首 ...

  6. 像写Flutter一样开发Android原生应用

    要问到Flutter和Android原生App,在开发是有何区别,编程方式是绕不开的话题.Flutter采用声明式编程,Android原生开发则采用命令式编程. 声明式编程 VS. 命令式编程 我们首 ...

  7. Android开发之调用相机拍照与本地图库选择图片

    引用链接 Android开发之调用相机拍照与本地图库选择图片 Android调用相机实现拍照功能 部分截图 引言 小项目有一个访问相册的需求,在网上查找得到两位大神博客指点,但博客发布时间过旧,难免因 ...

  8. 用cocos2d-android开发android游戏时调用box2d中的native本地函数问题

    用cocos2d-android开发android游戏时调用box2d中的new World(Vector2,boolean)时,出现如下报错: "java.lang.Unsatisfied ...

  9. Android开发:调用系统图库选择图片

    方法: //调用系统图库选择图片 public Intent selectPicture() {Intent intent = new Intent(Intent.ACTION_PICK,androi ...

最新文章

  1. 与Oracle配套组件,oracle 组件和体系结构
  2. linux 挂载多余空间,linux 空间不够,磁盘挂载
  3. matlab中图像处理的基本函数(1)
  4. python实用库_python常用库
  5. 在raspberry pi上使用自己的内核
  6. 地址修改验证TAR Oracle部署
  7. nginx 配置支持URL HTML5 History 模式 与 设置代理
  8. Andriod获取本机ip地址
  9. win10桌面管理文件收纳_隐藏在Windows 10里的小技巧
  10. PIE Engine机器学习遥感影像监督分类全流程(附源码)
  11. 从零开始的单片机学习(二)
  12. 502 bad gateway原因、解决方法
  13. 修复 iPhone X H5 底部安全区域定位按钮下内容穿透 BUG
  14. 【转载】linux修改文件的所有者权限[root权限更改为用户权限]
  15. 默燃周报|音乐流平台 Emanate 将启用 NFT;WAX NFT 数量突破一百万
  16. 20X20 FCPX插件数字信息化故障干扰像素损坏风格英文标题模板GlitchAnimatedTypeface
  17. BackupPC 备份迁移的使用
  18. 另类数字剖析车王轨迹 舒马赫的16年F1赛车人生
  19. 最短路径flody算法
  20. ElitesAI·动手学深度学习PyTorch版-第三次打卡

热门文章

  1. bogus generating test data
  2. 修改个人社保关联医院网址
  3. 北京5月楼市低迷开局 会否大规模降价成关注点
  4. linux分区表位置,Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的分析与比较 分区表位置...
  5. MacBookPro 连接无线显示“密码无效”
  6. 【考试】2019.3二级C语言
  7. 【2019暑假集训】07.12比赛总结
  8. 【Win7上装双系统完美体验Windows8】
  9. 解决”dllhost进程消耗cpu 100%的问题
  10. dllhost.exe 解释