快速判断两个位图是否相同?

发布于 2024-12-01 20:35:33 字数 69 浏览 1 评论 0原文

我如何(尽快)通过值而不是通过引用确定两个位图是否相同?有什么快速的方法吗?

如果比较不需要非常精确怎么办?

How can I (as fast as possible) determine if two bitmaps are the same, by value, and not by reference? Is there any fast way of doing it?

What if the comparison doesn't need to be very precise?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

半城柳色半声笛 2024-12-08 20:35:33

您可以先检查尺寸 - 如果尺寸不同,则中止比较。

对于比较本身,您可以使用多种方式:

  • CRC32
    非常快但可能错误...可以用作第一次检查,如果不同则不同...否则需要进一步检查
  • MD5 / SHA1 / SHA512
    不是那么快但相当精确的
  • 异或
    对图像内容进行异或...出现第一个差异时中止...

you can check the dimensions first - and abort the comparison if they differ.

For the comparison itself you can use a variaty of ways:

  • CRC32
    very fast but possibly wrong... can be used as a first check, if it differs they are dfferent... otherwise further checking needed
  • MD5 / SHA1 / SHA512
    not so fast but rather precise
  • XOR
    XOR the image content... abort when the first difference comes up...
肩上的翅膀 2024-12-08 20:35:33

您可以使用 MD5 之类的简单哈希来确定它们的内容是否哈希为相同的值。

You can just use a simple hash like MD5 to determine if their contents hash to the same value.

但可醉心 2024-12-08 20:35:33

您将需要“不太精确”的非常精确的定义。

所有已发布的校验和或哈希方法仅适用于精确(像素和位)匹配。

如果您想要一个与“它们看起来(有些)相似”相对应的答案,您将需要更复杂的东西。

  • 根据长宽比进行一些预处理。 600x400 的图片可以像 300x300 的图片一样吗?
  • 使用图形算法将它们缩小到 100x100。
  • 还要减少颜色。
  • 然后逐像素比较结果(并设置错误阈值)。

You will need a very precise definition of "not very precise".

All the Checksum or Hash methods already posted work for an exact (pixel and bit) match only.

If you want an answer that corresponds to "they look (somewhat) alike" you will need something more complicated.

  • some preprocessing based on their aspect ratio. Can a 600x400 picture be like a 300x300 one?
  • use a graphics algorithm to scale them down to, say, 100x100.
  • Also reduce the colors.
  • Then compare the results pixel by pixel (and set an error treshold).
寒江雪… 2024-12-08 20:35:33

尝试比较两个文件的哈希值

using System;
using System.IO;
using System.Security.Cryptography;

class FileComparer
{
    static void Compare()
    {
        // Create the hashing object.
        using (HashAlgorithm hashAlg = HashAlgorithm.Create())
        {
            using (FileStream fsA = new FileStream("c:\\test.txt", FileMode.Open),
                fsB = new FileStream("c:\\test1.txt", FileMode.Open)){
                // Calculate the hash for the files.
                byte[] hashBytesA = hashAlg.ComputeHash(fsA);
                byte[] hashBytesB = hashAlg.ComputeHash(fsB);

                // Compare the hashes.
                if (BitConverter.ToString(hashBytesA) == BitConverter.ToString(hashBytesB))
                {
                    Console.WriteLine("Files match.");
                } else {
                    Console.WriteLine("No match.");
                }
            }
        }
    }
}

Try comparing the hashs of the two files

using System;
using System.IO;
using System.Security.Cryptography;

class FileComparer
{
    static void Compare()
    {
        // Create the hashing object.
        using (HashAlgorithm hashAlg = HashAlgorithm.Create())
        {
            using (FileStream fsA = new FileStream("c:\\test.txt", FileMode.Open),
                fsB = new FileStream("c:\\test1.txt", FileMode.Open)){
                // Calculate the hash for the files.
                byte[] hashBytesA = hashAlg.ComputeHash(fsA);
                byte[] hashBytesB = hashAlg.ComputeHash(fsB);

                // Compare the hashes.
                if (BitConverter.ToString(hashBytesA) == BitConverter.ToString(hashBytesB))
                {
                    Console.WriteLine("Files match.");
                } else {
                    Console.WriteLine("No match.");
                }
            }
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文