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素材尊重知识产权,如知识产权权利人认为平台内容涉嫌侵权,可联系我们,我们将及时处理。
网站提供的党政主题相关内容(国旗、国徽、党徽...),目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。