利用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号!" ); } } } } |
到此这篇关于c#验证两个QQ头像相似度的文章就介绍到这了,更多相关c#QQ头像相似度内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qq_44838095/article/details/123356963