C#驗證兩個QQ頭像相似度的示例代碼
更新時間:2022年03月11日 10:32:39 作者:一只想飛的小螞蟻
這篇文章主要介紹了c#驗證兩個QQ頭像相似度,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
利用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é)合實例形式較為詳細(xì)的講解了雙向鏈表的概念及C#實現(xiàn)雙向鏈表的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11

