1)用户上传的图片素材不停的增长,数据量已经达到百万级,以后这个量还会不断累加。
2)由于是自主上传,导致网站充斥着大量的重复素材,给审核工作带来挑战,同时也极大的浪费了网站的空间存储。
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //下载供比较的图片 ImgSave("1.png", "https://www.91sc.com/UploadFile/img/pic11661178.png"); ImgSave("2.png", "https://www.91sc.com/UploadFile/img/pic11665223.png"); string path = System.Environment.CurrentDirectory + "\\"; //以下生成两张图片的指纹 string fileName = path + "1.png"; Bitmap baseBM = new Bitmap(FileToBitmap(fileName), 256, 256); int[] baseBit = GetHisogram(baseBM); string[] strs = Array.ConvertAll<int, string>(baseBit, delegate (int input) { return input.ToString(); }); string fingerPrint1 = string.Join(",", strs); baseBM.Dispose(); File.Delete(fileName); fileName = path + "2.png"; baseBM = new Bitmap(FileToBitmap(fileName), 256, 256); baseBit = GetHisogram(baseBM); strs = Array.ConvertAll<int, string>(baseBit, delegate (int input) { return input.ToString(); }); string fingerPrint2 = string.Join(",", strs); baseBM.Dispose(); File.Delete(fileName); //开始比较两张图片的指纹 string[] baseArr1 = fingerPrint1.Split(','); int[] baseBit1 = Array.ConvertAll(baseArr1, int.Parse); string[] baseArr2 = fingerPrint2.Split(','); int[] baseBit2 = Array.ConvertAll(baseArr2, int.Parse); int result = Convert.ToInt32(SimilarImage.GetResult(baseBit1, baseBit2) * 100); MessageBox.Show("两张图片,相似度为 " + result + " %。"); //说明:超过一定的相似度值,说明两者相似 } /// <summary> /// 下载网络图片 /// </summary> /// <param name="fileName"></param> /// <param name="url"></param> public void ImgSave(string fileName, string url) { //url = "https://m.91sc.com/UploadFile/img/pic11661178.png"; WebRequest imgRequest = WebRequest.Create(url); HttpWebResponse res; try { res = (HttpWebResponse)imgRequest.GetResponse(); } catch (WebException ex) { res = (HttpWebResponse)ex.Response; } if (res.StatusCode.ToString() == "OK") { System.Drawing.Image downImage = System.Drawing.Image.FromStream(imgRequest.GetResponse().GetResponseStream()); string path = System.Environment.CurrentDirectory + "\\"; downImage.Save(path + fileName); downImage.Dispose(); } } /// <summary> /// 图片转Bitmap /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static Bitmap FileToBitmap(string fileName) { // 打开文件 FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); // 读取文件的 byte[] byte[] bytes = new byte[fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); fileStream.Close(); // 把 byte[] 转换成 Stream Stream stream = new MemoryStream(bytes); stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始 stream.Seek(0, SeekOrigin.Begin); MemoryStream mstream = null; try { mstream = new MemoryStream(bytes); return new Bitmap((Image)new Bitmap(stream)); } catch (ArgumentNullException ex) { return null; } catch (ArgumentException ex) { return null; } finally { stream.Close(); } } public int[] GetHisogram(Bitmap img) { BitmapData data = img.LockBits(new System.Drawing.Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); int[] histogram = new int[256]; unsafe { byte* ptr = (byte*)data.Scan0; int remain = data.Stride - data.Width * 3; for (int i = 0; i < histogram.Length; i++) histogram[i] = 0; for (int i = 0; i < data.Height; i++) { for (int j = 0; j < data.Width; j++) { int mean = ptr[0] + ptr[1] + ptr[2]; mean /= 3; histogram[mean]++; ptr += 3; } ptr += remain; } } img.UnlockBits(data); return histogram; } } public class SimilarImage { public SimilarImage() { } public static float GetResult(int[] firstNum, int[] scondNum) { if (firstNum.Length != scondNum.Length) { return 0; } else { float result = 0; int j = firstNum.Length; for (int i = 0; i < j; i++) { result += 1 - GetAbs(firstNum[i], scondNum[i]); //Console.WriteLine(i + "----" + result); } return result / j; } } private static float GetAbs(int firstNum, int secondNum) { float abs = Math.Abs((float)firstNum - (float)secondNum); float result = Math.Max(firstNum, secondNum); if (result == 0) result = 1; return abs / result; } }
说明:本文为了方便 ,特地将核心代码进行了提取与改写,脱离了项目环境,方便网友使用。
演示代码下载 https://www.91sc.com/code/code-12983967.html
如有问题或交流请留言。
版权声明
此作品来源于第三方分享者设计上传,其版权归原创作者拥有。若作为商业用途,请获取模板原作者授权或替换相应素材,相关字体以及人物肖像需版权方额外授权,请谨慎使用,91素材不承担由此引发的一切版权纠纷。
91素材尊重知识产权,如知识产权权利人认为平台内容涉嫌侵权,可联系我们,我们将及时处理。
网站提供的党政主题相关内容(国旗、国徽、党徽...),目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。