关于开发Android应用时写从图库选择头像功能时遇到的一些问题。
首先是最基本的调用图库获取图像的代码。我直接贴出来。也是当个笔记吧。事实是我记不下来。。。
先是调用系统图库
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应用时写从图库选择头像功能时遇到的一些问题。相关推荐
- Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能
支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几 ...
- Android中调用另一个Activity并返回结果-以模拟选择头像功能为例
场景 Android中点击按钮启动另一个Activity以及Activity之间传值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...
- Android 三星手机拍照,从图库选择照片旋转问题完美解决
好久没有写博客了,最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok没有问题,唯独三星的手机拍照之后,你会很清楚 ...
- android添加截图功能,Android应用开发之Android 5.0及以上编程实现屏幕截图功能的方法...
本文将带你了解Android应用开发Android 5.0及以上编程实现屏幕截图功能的方法,希望本文对大家学Android有所帮助. 本文实例讲述了Android 5.0及以上编程实现屏幕截图功能 ...
- android studio放置在函数上面看_像写Flutter一样开发Android原生应用
要问到Flutter和Android原生App,在开发时有何区别,编程方式是绕不开的话题.Flutter采用声明式编程,Android原生开发则采用命令式编程. 声明式编程 VS. 命令式编程 我们首 ...
- 像写Flutter一样开发Android原生应用
要问到Flutter和Android原生App,在开发是有何区别,编程方式是绕不开的话题.Flutter采用声明式编程,Android原生开发则采用命令式编程. 声明式编程 VS. 命令式编程 我们首 ...
- Android开发之调用相机拍照与本地图库选择图片
引用链接 Android开发之调用相机拍照与本地图库选择图片 Android调用相机实现拍照功能 部分截图 引言 小项目有一个访问相册的需求,在网上查找得到两位大神博客指点,但博客发布时间过旧,难免因 ...
- 用cocos2d-android开发android游戏时调用box2d中的native本地函数问题
用cocos2d-android开发android游戏时调用box2d中的new World(Vector2,boolean)时,出现如下报错: "java.lang.Unsatisfied ...
- Android开发:调用系统图库选择图片
方法: //调用系统图库选择图片 public Intent selectPicture() {Intent intent = new Intent(Intent.ACTION_PICK,androi ...
最新文章
- 与Oracle配套组件,oracle 组件和体系结构
- linux 挂载多余空间,linux 空间不够,磁盘挂载
- matlab中图像处理的基本函数(1)
- python实用库_python常用库
- 在raspberry pi上使用自己的内核
- 地址修改验证TAR Oracle部署
- nginx 配置支持URL HTML5 History 模式 与 设置代理
- Andriod获取本机ip地址
- win10桌面管理文件收纳_隐藏在Windows 10里的小技巧
- PIE Engine机器学习遥感影像监督分类全流程(附源码)
- 从零开始的单片机学习(二)
- 502 bad gateway原因、解决方法
- 修复 iPhone X H5 底部安全区域定位按钮下内容穿透 BUG
- 【转载】linux修改文件的所有者权限[root权限更改为用户权限]
- 默燃周报|音乐流平台 Emanate 将启用 NFT;WAX NFT 数量突破一百万
- 20X20 FCPX插件数字信息化故障干扰像素损坏风格英文标题模板GlitchAnimatedTypeface
- BackupPC 备份迁移的使用
- 另类数字剖析车王轨迹 舒马赫的16年F1赛车人生
- 最短路径flody算法
- ElitesAI·动手学深度学习PyTorch版-第三次打卡
热门文章
- bogus generating test data
- 修改个人社保关联医院网址
- 北京5月楼市低迷开局 会否大规模降价成关注点
- linux分区表位置,Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的分析与比较 分区表位置...
- MacBookPro 连接无线显示“密码无效”
- 【考试】2019.3二级C语言
- 【2019暑假集训】07.12比赛总结
- 【Win7上装双系统完美体验Windows8】
- 解决”dllhost进程消耗cpu 100%的问题
- dllhost.exe 解释