欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

程序员文章站 2022-01-23 10:20:22
效果图:完全代码(下方有详细解读) private void textbox1_textchanged(object sender, eventargs e) {//这里是文本框的事件...

效果图:

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

完全代码(下方有详细解读)

 private void textbox1_textchanged(object sender, eventargs e)
        {//这里是文本框的事件 值发生 改变时发生

            stringbuilder userid = new stringbuilder(20);
            //值经常发生改变 使用stringbuilder 并且开辟20字符的空间

            regex r = new regex(@"[\d]");
            //正则表达式 过滤字符  \d表示只要0-9的数字
            //也就是全部数字

            matchcollection match = r.matches(textbox1.text);
            //需要匹配的字符串 

            foreach (match user in match)
            {//使用循环 过滤不需要的字符串

                userid.append(user);
                //过滤好的字符串 添加进stringbuilder
            }

            if (userid.length <= 4)
            {
                //判断匹配好的字符串是否大于4
                //因为qq最低是5位数...
                return;
            }


            thread th = new thread(() => beg(userid.tostring()));
            //创建线程      把 stringbuilder 值传递过去

            th.isbackground = true;
            //设置成后台线程

            th.start();
            //开始线程
        }

线程执行的方法:

 public void beg(string id)
        {
            //线程执行的方法体


           try
            {
                httpwebrequest beg = (httpwebrequest)webrequest.create("http://q1.qlogo.cn/g?b=qq&nk="+id+"&s=2");
                //发送请求 

                beg.timeout = 5000;
                //请求的时间为5秒 超过就停止请求

                httpwebresponse wb = (httpwebresponse)beg.getresponse();
                //接收服务器返回的请求

                stream s = wb.getresponsestream();
                //把回来的请求变 一个 流

                using (image i = new bitmap(s))
                {    //把流传递过来

                    bitmap b = new bitmap(50, 50); //初始像素值

                    using (graphics g = graphics.fromimage(b))
                    {//使用gdi画图  在图片上画 

                        g.smoothingmode = smoothingmode.highquality;
                        //图片的抗锯齿

                        using (graphicspath p = new graphicspath(system.drawing.drawing2d.fillmode.alternate))
                        {
                            p.addellipse(0, 0, i.width, i.height);//添加椭圆

                            g.fillpath(new texturebrush(i), p);//填充里面

                            picturebox1.image = b;
                            //赋值给图片框
                        }

                    }

                }
            }
            catch
            {

            }

        }

前言:

某论坛的评论区模块,发现这功能很不错,琢磨了一晚上做了大致一样的,用来当做 注册模块 的头像绑定功能

某论坛评论区模块(动图)

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

注册模块功能建议:

用户注册时,可以选择性的上传头像,如果没上传头像,就默认使用qq绑定的头像

获取qq头像的接口:

http://q1.qlogo.cn/g?b=qq&nk=这里是qq号&s=2 这里是尺寸

http://q1.qlogo.cn/g?b=qq&nk=972001531&s=2

尺寸标识符 尺寸大小
1 40 × 40
2 40 × 40
3 100 × 100
4 140 × 140
5 640 × 640
40 40 × 40
100 100 × 100
按照自己头像框的大小自行选择

就是一个头像的url

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

也可以可下载本地 上传服务器等…自行研究

接口有了 接下来就是 使用c#去实现功能了…

界面图:

为了方便演示 没有做其他的功能…简单的搭建了一个窗体

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法
C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

从图可以看出 每修改一个数字都会重新获取一次的头像,
所以代码就写在文本框的事件里

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

该事件的意思就是 每当文本框的内容发生改变时发生

过滤输入的字符:

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

考虑到可能会输入一些 乱七八糟的字符串
例:9720ada15
这样就识别不了是一个qq号 所以需要过滤掉,只识别数字

正则表达式过滤字符:
定义规则

 regex r = new regex(@"[\d]");
//正则表达式 过滤字符  \d表示只要0-9的数字
   或者
 regex r = new regex(@"[0-9]");         

存储匹配好的字符串

 regex r = new regex(@"[\d]");
//正则表达式 过滤字符  \d表示只要0-9的数字
   或者
 regex r = new regex(@"[0-9]");         

匹配字符串:

 foreach (match user in match)
            {//使用循环 过滤不需要的字符串

                userid.append(user);
                //过滤好的字符串 添加进stringbuilder
            }

判断匹配好的长度

 if (userid.length <= 4)
            {
                //判断匹配好的字符串是否大于4
                //因为qq最低是5位数...
                return;
                //不大于4就返回
            }

使用接口qq接口:

因为接口是一个网页 所以需要发送请求
需要用到

httpwebrequest: 发送网页请求
httpwebresponse: 接收服务器发送的请求

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

但发送请求时又有一个 问题 那就是 如果网速比较慢 或者 服务器 响应速度慢 会造成 软件的假死 但是可以通过线程解决这个问题…

定义线程:

thread th = new thread(() => beg(userid.tostring()));
    //创建线程      把 stringbuilder 值传递过去
    
    th.isbackground = true;
    //设置成后台线程

    th.start();
    //开始线程
}

线程执行的方法:

发起请求:

 httpwebrequest beg = (httpwebrequest)webrequest.create("http://q1.qlogo.cn/g?b=qq&nk="+id+"&s=2");
                //发送请求 
 beg.timeout = 5000;
                //请求的时间为5秒 超过就停止请求

接收返回请求:

   httpwebresponse wb = (httpwebresponse)beg.getresponse();
        //接收服务器返回的请求 流的方式

使用流转换:

得到流后 可以把图片保存到 本地 等等…

  stream s = wb.getresponsestream();
                //把回来的请求变 一个 流

图片转成圆形:

图片框的默认情况下是 方形

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

并没有直接的属性变成圆形…
这里使用gdi继续绘制

using (image i = new bitmap(s))
                {    //把流传递过来

                    bitmap b = new bitmap(50, 50); //初始像素值

                    using (graphics g = graphics.fromimage(b))
                    {//使用gdi画图  在图片上画 

                        g.smoothingmode = smoothingmode.highquality;
                        //图片的抗锯齿

                        using (graphicspath p = new graphicspath(system.drawing.drawing2d.fillmode.alternate))
                        {
                            p.addellipse(0, 0, i.width, i.height);//添加椭圆

                            g.fillpath(new texturebrush(i), p);//填充里面

                            picturebox1.image = b;
                            //赋值给图片框
                        }

                    }

                }

C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

这样就完成了 …

到此这篇关于c# 获取指定qq头像绘制圆形头像框gdi(graphics)的文章就介绍到这了,更多相关c# 圆形头像框内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!