关闭

打造微信圆形头像更换

标签: 圆形头像Android圆形头像头像的更换调用系统相册
7534人阅读 评论(0) 收藏 举报
分类:

       很多都会发现微信的头像不是圆形,而今天我将浅谈一下,如何实现圆形头像。QQ5.0以后的版本就是圆形头像了而微信不是。当然了实现圆形头像的方法有很多种,可以使用开源的库,可以去写一个自定义的控件,或者去使用PS把它扣成一个圆形,但是这个方法显然不可取,不可能每个用户都是上传裁剪过后的圆形头像。那么今天我将讲解一种利用代码来裁剪一个圆形头像。另一方面也是为了让自己以后复习参考方便。

      实现思想如下:

我们实现一个圆形头像的更换肯定主要分为两步:第一要去调用系统的相册,第二拿到照片返回页面设置图片资源及获取到的图片进行圆形的裁剪。

一、调用系统的相册:

首先,通过Intent对象跳到相册Intent.ACTION_PICK,URI为操作的数据的相对路径

Intent intent =new Intent(Intent.ACTION_PICK,Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 0);//选择了图片会返回一个结果,0是requestCode请求码

然后会返回一个结果,所以需要用onActivityResult方法去接收返回的结果,重写onActivityResult方法

//重写onActivityResult方法获取返回的数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
//通过前面设置的requestCode为0,然后标示接受哪些数据
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case RESULT_OK:
Uri uri =data.getData();//拿到路径从而拿到数据
String [] filePath={MediaStore.Images.Media.DATA};//拿到图片的路径
//在Android通过游标(相当于指针)来操作数据
Cursor query=getContentResolver().query(//内容接收者去拿内容发送者那去拿
uri,
filePath, //返回的数据
null,
null,
null);
query.moveToFirst();
int columnIndex=query.getColumnIndex(filePath[0]);
String imagePath=query.getString(columnIndex);//路径拿到
query.close();//游标关闭
Bitmap decodBitmap=BitmapFactory.decodeFile(imagePath);//获取到系统相册中的图片的路径则就可以转化成一个bitmap对象,就可以给Imageview设置一个一张图片。
headerView.setImageBitmap(createCicleImage(decodBitmap));
break;
default:
break;
}
}

获取图片以后就是要将我们获取到的图片裁剪成一个圆形的头像。

二、将图片裁剪成一个圆形的头像:

在裁剪头像前我们需要分析明确几点,在我们所有中的图片尺寸就只有三种,第一,高度小于宽度(理解为水平方向长);第二,高度大于宽度(竖直方向长);第三就是相等,这就是我们想要的,所以我们只考虑前面两种。针对前面两种分别给出示意图讲解裁剪的原理。

1 高度小于宽度:


2、高度大于宽度


接下来就是实现的具体代码:

@Override
	//重写onActivityResult方法获取返回的数据
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		//通过前面设置的requestCode为0,然后标示接受哪些数据
		super.onActivityResult(requestCode, resultCode, data);
		switch (resultCode) {
		case RESULT_OK:
			Uri uri =data.getData();//拿到路径从而拿到数据
			String [] filePath={MediaStore.Images.Media.DATA};//拿到图片的路径
			//在Android通过游标(相当于指针)来操作数据
			Cursor	query=getContentResolver().query(//内容接收者去拿内容发送者那去拿
					uri,
					filePath, //返回的数据
					null,
					null,
					null);
			query.moveToFirst();
			int columnIndex=query.getColumnIndex(filePath[0]);
			String imagePath=query.getString(columnIndex);//路径拿到
			query.close();//游标关闭
			Bitmap decodBitmap=BitmapFactory.decodeFile(imagePath);
			headerView.setImageBitmap(createCicleImage(decodBitmap));
			break;
		default:
			break;
		}

	}
	/**
	 * @author zhongqihong
	 * 将头像裁剪成圆形
	 * */
	private Bitmap createCicleImage(Bitmap bt){
		int height=bt.getHeight();
		int width=bt.getWidth();
		int left,top,bottom,right;//绘制图片区域的坐标,也即是将原图片切成正方形的图片的坐标,以原图片的左上角作为原点
		int dst_left,dst_top,dst_bottom,dst_right;//绘制在屏幕上的图片的位置的坐标,也即是在切好的正方形的原图上,并以切好的正方形图的左上角作为原点
		int RoundX;//半径的坐标
		if (height>=width) {
			//用canvas画圆形,取小的做直径,此时高度大于宽度就是一张竖直方向的图片
			RoundX=width/2;
			top=0;
			left=0;
			bottom=width;
			right=width;
			dst_left=0;
			dst_top=0;
			dst_bottom=width;
			dst_right=width;
		}else{
			RoundX=height/2;
			int filp=(width-height)/2;
			left=filp;
			right=filp+height;
			top=0;
			bottom=height;
			dst_bottom=height;
			dst_right=height;
			dst_left=0;
			dst_top=0;
		}
		Bitmap createBitmap=Bitmap.createBitmap(width,height,Config.ARGB_8888);
		Canvas canvas=new Canvas(createBitmap);//在画布填充这张图片
		canvas.drawARGB(0, 0, 0, 0);//第一个a就是透明度,其他为三原色
		Paint paint=new Paint();//new 一个画笔
		paint.setAntiAlias(true);//设置抗锯齿的
		int color=0xff424242;
		paint.setColor(color);
		Rect r= new Rect(dst_left, dst_top, dst_right, dst_bottom);//设置四个点的坐标,也即就是绘制一个正方形区域,然后再把原图覆盖到正方形区域中,在正方形区域范围内的图像就显示,不在的就不显示,那样就好像将图片裁剪成一个正方形的图片,原图片中切出正方形四个点所在的坐标
		Rect image_r=new Rect(left, top, right, bottom);//在切好的正方形图片上的四个点的坐标,并在该坐标轴中设置绘制圆形的图片的中心坐标,制定图片的圆形区域
		RectF rect=new RectF(r);
		canvas.drawRoundRect(rect, RoundX, RoundX, paint);//把图片绘制在屏幕的位置,rx,ry绘制的中心点
		paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));//这行代码很重要
		canvas.drawBitmap(bt, image_r, r, paint);//绘制图片
		return createBitmap;
	}

最后就是运行结果:




1
0
查看评论

thinkphp实现图片裁剪并生成圆形图片整合

thinkphp实现图片裁剪并生成圆形图片
  • a610531444
  • a610531444
  • 2017-04-13 17:55
  • 578

Android圆形头像设置(实现相机、相册选择并裁剪)兼容6.0/7.0

android头像设置,拍照、相册选择并编辑、兼容7.0 6.0
  • z740852294
  • z740852294
  • 2017-08-22 10:34
  • 913

android中的制作圆形头像并且上传服务器

//设置头像,将获取的图片进行剪切;头像上传的方式为以文件上传,所以将图片转化成文件的格式; package com.example.uploadpicdemo; import java.io.File; import android.app.Activity; impo...
  • Jieshuai_0258
  • Jieshuai_0258
  • 2017-02-16 14:03
  • 553

php把图片处理成圆形透明的图片,做圆形透明头像【微信头像】

PHP合成推广微信推广海报 PHP合成图片 PHP在图片上添加文字 PHP制作图片 http://blog.csdn.net/qq_36176250/article/details/77880156将活动背景图片设置透明,然后和动态二维码图片合成一张图片 http://blog.csdn.net...
  • luogan129
  • luogan129
  • 2017-11-30 15:40
  • 1180

iOS - 把应用里边的头像/图片裁剪成圆形

把图片裁剪成圆形带边框的样式
  • dylan_lwb_
  • dylan_lwb_
  • 2014-09-16 10:29
  • 1913

让我的头像圆起来--Android之圆头像 .

http://blog.csdn.net/doublefi123/article/details/8795282   在很多应用中,我们看到,个人主页里面的头像一般都是圆的,设计成圆的会使整个界面布局变的优雅漂亮。那么,怎么使头像变圆呢?有的人说可以在上面加一个中间为透明圆形的png图...
  • dajian790626
  • dajian790626
  • 2013-11-30 18:28
  • 45527

Android实现从相册选择或者直接拍照来设置圆形的头像CircleImageView

本人第一次写技术博客,只是为了对自己平时遇到的一些问题进行一个总结,可以让以后能更好的翻看学习,也可以让更多的人借鉴。 废话不多说,正题开始: 首先先说明如何进行从相册选择或者直接拍照来设置头像,然后在进行圆形头像的设置。具体的界面效果如下所示:        ...
  • qq_21139343
  • qq_21139343
  • 2016-07-11 15:35
  • 2392

div、css圆形头像

1578****854 CSS3圆形头像 header.png 效果图
  • qq285679784
  • qq285679784
  • 2016-04-27 09:37
  • 3087

cocos2dx 剪切圆形头像

项目需求,要把矩形的头像(或任意图片)剪切成圆形的。然后在网上找到一些方法,并做了简单修改。这里做下记录。 cc.exports.display = display or {} function display.createMaskedSprite(srcFile, maskFile) ...
  • keven418440201
  • keven418440201
  • 2016-11-24 18:05
  • 1729

cocos2dx中ClippingNode实现带边框圆形头像

有个小需求,需要实现一个圆形的头像。要ui设计直接给圆形的png当然可以,但这种解决方式总是不优雅。然后就在网上查了半天,最终找到了使用ClippingNode来实现的方法。 关于ClippingNode,有一篇十分详细的文章,推荐一下: 裁剪节点ClippingNode 作者写得十分详细,并且分析...
  • pur_e
  • pur_e
  • 2016-01-19 10:09
  • 3782
    个人资料
    • 访问:276658次
    • 积分:3300
    • 等级:
    • 排名:第12165名
    • 原创:79篇
    • 转载:1篇
    • 译文:0篇
    • 评论:176条
    欢迎一起搞事情

    由于个人私事问题,把CSDN博客搁置了很久了。发现有很多小伙伴在博客留言了很多问题,以及很多小伙伴私信我,我也没有来得及看。所以感到非常抱歉。因为曾想到自己遇到问题求助他人不成功的痛苦,所以决定开个QQ搞事情交流群,里面会一一回复博客和私信中的问题,会包括百度地图的SDK的开发和每途嗅嗅APP源码的问题。

    感谢持续关注,后期文章会慢慢补回来,我又回来了,欢迎一起搞事情.QQ交流群:621387914


    我的第一个上线的APP
    每途嗅嗅APP
    谢谢大家多多支持!
    博客专栏