利用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号!"); } } } } |