C#驗證兩個QQ頭像相似度的示例代碼
更新時間:2022年03月11日 10:32:39 作者:一只想飛的小螞蟻
這篇文章主要介紹了c#驗證兩個QQ頭像相似度,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
利用c#查看出某個其他qq的頭像與自己頭像的相似度,先看效果圖
這里我是將左邊的頭像作為比對的基本圖,我目前做的是一圖比對一圖,因為理解好了一對一,一對多也不難,我們可以得出相似的像素,然后大于多少百分比就是同一圖的改變了,以下是完整代碼
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號,點擊查看,點擊驗證,得出結(jié)果。"; } 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 = "相同像素個數(shù):" + countSame + ",不同像素個數(shù):" + countDifferent + "用時:" + stopwatch.ElapsedMilliseconds + " 毫秒"; } //byte[] 轉(zhuǎn)圖片 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(); 這兩句都可以,至于區(qū)別么,下面有解釋 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); // 設(shè)置畫布的描繪質(zhì)量 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(); // 以下代碼為保存圖片時,設(shè)置壓縮質(zhì)量 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號!"); } } } }
到此這篇關(guān)于c#驗證兩個QQ頭像相似度的文章就介紹到這了,更多相關(guān)c#QQ頭像相似度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#數(shù)據(jù)結(jié)構(gòu)之雙向鏈表(DbLinkList)實例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之雙向鏈表(DbLinkList),結(jié)合實例形式較為詳細的講解了雙向鏈表的概念及C#實現(xiàn)雙向鏈表的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11