C# 比較兩張圖片是否完全相同


  本文演示如何比較兩張圖片是否完全相同。

(注意:如果是比較兩張圖片是否相似,則比較復雜,涉及到機器學習)

方法一:把圖片保存到內存流中,然后轉化成 Base64 字符串進行比較

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;

namespace CompareImage
{
    class Program
    {
        static string sourceImageString;
        static string targetImageString;
        static List<string> _paths = new List<string>();

        static void Main(string[] args)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            string targetImageString = GetImageBase64String(@"xxx");
            //待比較的圖片文件路徑集合
            ProcessDirectory(@"yyy");

            foreach (var filePath in _paths)
            {
                string sourceImageString = GetImageBase64String(filePath);

                if (targetImageString.Equals(sourceImageString))
                {
                    Console.WriteLine("same");
                }
                else
                {
                    Console.WriteLine("different");
                }
            }

            stopwatch.Stop();
            Console.WriteLine("比較了 " + _paths.Count + " 張照片,總用時:" + stopwatch.ElapsedMilliseconds + " 毫秒");

            Console.ReadLine();
        }


        // 根據傳入的文件夾路徑,遞歸查出它包含的所有文件和文件夾,並處理各個文件夾下包含的文件
        public static void ProcessDirectory(string targetDirectory)
        {
            // 處理 targetDirectory 路徑下的文件列表
            string[] fileEntries = Directory.GetFiles(targetDirectory);

            foreach (string fileName in fileEntries)
            {
                ProcessFile(fileName);
            }

            // 遞歸到 targetDirectory 路徑下的子路徑中
            string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);

            foreach (string subdirectory in subdirectoryEntries)
            {
                ProcessDirectory(subdirectory);
            }
        }

        // 這里添加如何處理找到的文件的邏輯
        public static void ProcessFile(string path)
        {
            if (!path.Contains(".db"))
                _paths.Add(path);
        }

        static string GetImageBase64String(string imagePath)
        {
            string imageString = string.Empty;
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (Image image = Image.FromFile(imagePath))
                {
                    image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    imageString = Convert.ToBase64String(memoryStream.ToArray());
                }
            }

            return imageString;
        }
    }
}   

 方法二:按圖片尺寸依次比較各個像素值(要求圖片尺寸一樣)

using System;
using System.Diagnostics;
using System.Drawing;

namespace CompareImage
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            int countSame = 0;
            int countDifferent = 0;

            Bitmap bitmapSource = new Bitmap(@"xxx");
            Bitmap bitmapTarget = new Bitmap(@"yyy");

            //照片尺寸必須一樣
            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();
            Console.WriteLine("相同像素個數:" + countSame + ",不同像素個數:" + countDifferent + "用時:" + stopwatch.ElapsedMilliseconds + " 毫秒");

            Console.ReadLine();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM