C#教程
主页 > 软件编程 > C#教程 >

C#验证两个QQ头像相似度的代码

2022-03-11 | 秩名 | 点击:

利用c#查看出某个其他qq的头像与自己头像的相似度,先看效果图

请添加图片描述

这里我是将左边的头像作为比对的基本图,我目前做的是一图比对一图,因为理解好了一对一,一对多也不难,我们可以得出相似的像素,然后大于多少百分比就是同一图的改变了,以下是完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Diagnostics;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Drawing.Imaging;

using System.IO;

using System.Linq;

using System.Net;

using System.Net.Http;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace WindowsFormsApp1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        public static int width; //图片宽

        public static int height;//图片高

        public static string mypicurl;//我的图片地址

        public static string picurl;//图片地址

        private void Form1_Load(object sender, EventArgs e)

        {

            this.MyPicture.SizeMode = PictureBoxSizeMode.StretchImage;

            this.MyPicture.BorderStyle = BorderStyle.FixedSingle;

            this.OtherPicture.SizeMode = PictureBoxSizeMode.StretchImage;

            this.OtherPicture.BorderStyle = BorderStyle.FixedSingle;

            this.explain.Text = "操作步骤:左边输入自己qq号查看显示,右边输入别人qq号,点击查看,点击验证,得出结果。";

        }

 

        private void button2_Click(object sender, EventArgs e)

        {

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

 

            int countSame = 0;

            int countDifferent = 0;

 

            Image img = this.MyPicture.Image;

            Bitmap bitmapSource = new Bitmap(img);

            //Bitmap bitmapSource = BytesToBitmap(ResizeImage(mypicurl));

            width = bitmapSource.Width;

            height = bitmapSource.Height;

 

            Bitmap bitmapTarget = BytesToBitmap(ResizeImage(picurl));

            //照片尺寸必须一样

            for (int i = 0; i < bitmapTarget.Width; i++)

            {

                for (int j = 0; j < bitmapTarget.Height; j++)

                {

                    if (bitmapSource.GetPixel(i, j).Equals(bitmapTarget.GetPixel(i, j)))

                    {

                        countSame++;

                    }

                    else

                    {

                        countDifferent++;

                    }

                }

            }

 

            stopwatch.Stop();

            this.result.Text = "相同像素个数:" + countSame + ",不同像素个数:" + countDifferent + "用时:" + stopwatch.ElapsedMilliseconds + " 毫秒";

        }

        //byte[] 转图片 

        public static Bitmap BytesToBitmap(byte[] Bytes)

        {

            MemoryStream stream = null;

            try

            {

                stream = new MemoryStream(Bytes);

                return new Bitmap((Image)new Bitmap(stream));

            }

            catch (ArgumentNullException ex)

            {

                throw ex;

            }

            catch (ArgumentException ex)

            {

                throw ex;

            }

            finally

            {

                stream.Close();

            }

        }

        /// <summary>

        /// 图片大小裁剪

        /// </summary>

        /// <param name="filePath"></param>

        /// <returns></returns>

        public static byte[] ResizeImage(string filePath)

        {

 

            WebRequest request = (WebRequest)HttpWebRequest.Create(filePath);

            WebResponse response = request.GetResponse();

            using (Stream stream = response.GetResponseStream())

            {

                Bitmap bm = (Bitmap)Image.FromStream(stream);

 

                bm = GetThumbnail(bm, height, width);

                MemoryStream ms = new MemoryStream();

                bm.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

                byte[] bytes = ms.GetBuffer();  //byte[]   bytes=   ms.ToArray(); 这两句都可以,至于区别么,下面有解释

                ms.Close();

                return bytes;

            }

 

        }

        /// <summary>

        /// 修改图片的大小

        /// </summary>

        /// <param name="b"></param>

        /// <param name="destHeight"></param>

        /// <param name="destWidth"></param>

        /// <returns></returns>

        public static Bitmap GetThumbnail(Bitmap b, int destHeight, int destWidth)

        {

            System.Drawing.Image imgSource = b;

            System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;

            int sW = 0, sH = 0;

            // 按比例缩放          

            int sWidth = imgSource.Width;

            int sHeight = imgSource.Height;

            if (sHeight > destHeight || sWidth > destWidth)

            {

                if ((sWidth * destHeight) > (sHeight * destWidth))

                {

                    sW = destWidth;

                    sH = (destWidth * sHeight) / sWidth;

                }

                else

                {

                    sH = destHeight;

                    sW = (sWidth * destHeight) / sHeight;

                }

            }

            else

            {

                sW = sWidth;

                sH = sHeight;

            }

            Bitmap outBmp = new Bitmap(destWidth, destHeight);

            Graphics g = Graphics.FromImage(outBmp);

            g.Clear(Color.Transparent);

            // 设置画布的描绘质量        

            g.CompositingQuality = CompositingQuality.HighQuality;

            g.SmoothingMode = SmoothingMode.HighQuality;

            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            g.DrawImage(imgSource, new Rectangle((destWidth - sW) / 2, (destHeight - sH) / 2, sW, sH), 0, 0, imgSource.Width, imgSource.Height, GraphicsUnit.Pixel);

            g.Dispose();

            // 以下代码为保存图片时,设置压缩质量    

            EncoderParameters encoderParams = new EncoderParameters();

            long[] quality = new long[1];

            quality[0] = 100;

            EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);

            encoderParams.Param[0] = encoderParam;

            imgSource.Dispose();

            return outBmp;

        }

 

        private void button3_Click(object sender, EventArgs e)

        {

            if (this.OtherQQ.Text == "")

            {

                MessageBox.Show("请输入qq号!");

                return;

            }

            HttpClient httpClient = new HttpClient();

            string url = "https://api.usuuu.com/qq/" + this.OtherQQ.Text;

            var rsp = httpClient.GetAsync(url).Result;

            var str = rsp.Content.ReadAsStringAsync().Result;

            JObject jo = (JObject)JsonConvert.DeserializeObject(str);

            if ((string)jo["code"] == "200")

            {

                Image pic = Image.FromStream(WebRequest.Create((string)jo["data"]["avatar"]).GetResponse().GetResponseStream());

                this.OtherPicture.Image = pic;

                picurl = (string)jo["data"]["avatar"];

            }

            else

            {

                MessageBox.Show("请输入正确的qq号!");

            }

        }

 

        private void button4_Click(object sender, EventArgs e)

        {

            if (this.MyQQ.Text == "")

            {

                MessageBox.Show("请输入qq号!");

                return;

            }

            HttpClient httpClient = new HttpClient();

            string url = "https://api.usuuu.com/qq/" + this.MyQQ.Text;

            var rsp = httpClient.GetAsync(url).Result;

            var str = rsp.Content.ReadAsStringAsync().Result;

            JObject jo = (JObject)JsonConvert.DeserializeObject(str);

            if ((string)jo["code"] == "200")

            {

                Image pic = Image.FromStream(WebRequest.Create((string)jo["data"]["avatar"]).GetResponse().GetResponseStream());

                this.MyPicture.Image = pic;

                mypicurl = (string)jo["data"]["avatar"];

            }

            else

            {

                MessageBox.Show("请输入正确的qq号!");

            }

        }

    }

}

原文链接:https://blog.csdn.net/qq_44838095/article/details/123356963
相关文章
最新更新