【问题标题】:Search images using c# in local images folder在本地图像文件夹中使用 c# 搜索图像
【发布时间】:2010-06-16 08:35:22
【问题描述】:

我们有一个图像文件夹,其中包含大约一百万张图像。 我们需要编写一个程序,该程序将根据用户输入的关键字获取图像。 我们需要在搜索时匹配文件名以找到正确的图像。 寻找任何建议。 谢谢 否

【问题讨论】:

  • 这是桌面应用还是网络应用?

标签: c# .net search


【解决方案1】:
  1. 将图像保存在单独的站点或子域中。当然,您可能不希望将所有 1M 文件放在一个目录中。

  2. 您需要一个包含(至少)三个表的数据库:

图像文件 ID 文件路径 关键词 ID 这个单词 图片关键字 图片ID 关键字ID

【讨论】:

  • 除此之外,您还可以对图像进行哈希处理,以便检查图像是否确实已经存在。不要使用 MD5,因为它可以为不同的文件产生相同的结果 - 尝试 SHA1 或更高版本。
  • @Dominic:当然。您认为哪种应用会从中受益?
  • @Dominic Zukiewicz:“不要使用 MD5 而是使用 SHA-1”?!很好,MD5 是 128 位,SHA-1 是 160,但是给 SHA-1 提供任何大于 80 字节的内容最终会导致冲突。说 SHA-1 永远不会产生冲突只是愚蠢的说法..
  • 如果您想检查数据库中是否已经存在确切的文件,哈希会有所帮助。但我是说已知某些算法会为完整的不同文件生成相同的密钥。 @Patrick - 我很欣赏这些算法已经被破坏,特别是对于具有如此多样化数据的图像。我们可以就 SHA-256 达成一致吗?只是试图在速度和数据紧凑性之间取得平衡。
【解决方案2】:

根据操作系统,我建议您使用索引服务、Windows 桌面搜索或最新版本的 Windows 搜索。这解决了您基于关键字查找文件的问题,它解决了与文件夹中文件数量有关的性能问题,它具有可扩展性,并且易于扩展。

http://msdn.microsoft.com/en-us/library/dd940335(VS.85).aspxDSearch 示例几乎完全符合您的要求,并且易于实施。

例如,如果查询一百万个文件并且需要将文件移动到子文件夹以提高性能,那么您可以简单地创建文件夹并移动文件。您无需更改任何代码。

如果您需要更改关键字的应用方式,例如使用文件摘要属性的关键字,则只需更改查询即可。

对于以后的操作系统,您甚至不需要安装任何软件,因为搜索功能是操作系统的一部分,可通过 OleDB 获得。如果您想使用 高级查询语法 (AQS),Microsoft 提供了一个类型库来访问 COM 接口,从而可以轻松生成 SQL 命令来查询索引数据库。

老实说,所有这些关于数据库等的其他建议都是浪费时间。

【讨论】:

  • 如果关键字将嵌入文件元数据中,则这些方法有效。建议数据库的人假设不是这样,他希望集中编辑关键字。
  • @egrunin:您可以将关键字存储在操作系统提供的文件的摘要信息中,该信息存储为备用数据流。关键字可以通过 Windows 资源管理器进行管理。一切都已提供。
【解决方案3】:

将所有(图像和关键字)存储在数据库中。

您可以使用全文索引来搜索单词,或将每个单词存储为单独的条目。

而且您可以更快地访问元数据(文件名、创建日期等),而无需检索(或打开)图像本身。

这可能比依赖一个文件系统要快得多,而不是在一个文件夹中存储一百万个条目。

【讨论】:

    【解决方案4】:

    这是显而易见的,但可以想象一百万张图片会很慢:

    public IList<string> GetMatchingImages(string path, string keyword)
        {
            var matches = new List<string>();
    
            var images = System.IO.Directory.GetFiles(path);
    
            foreach (var image in images)
            {
                if (image.Contains(keyword))
                {
                    matches.Add(image);
                }
            }
    
            return matches;
        }
    

    【讨论】:

      【解决方案5】:

      从文件夹中获取一百万个文件名将花费大量时间。我建议您获取文件名并将它们放入数据库中。这样您就可以在几秒钟内而不是几分钟内搜索名称。

      【讨论】:

        【解决方案6】:

        有 Win32 API FindFirstFile、FindNextFile、FindClose:http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx - 可能它们也以某种方式映射到 .NET。使用它们在没有任何数据库的情况下搜索图像。

        【讨论】:

          【解决方案7】:

          对于如此大量的图像,我的第一个想法是创建一个倒排列表用作索引。

          如果您能够维护此列表,那么搜索速度会相对较快,并且您不必搜索一百万张图片,我猜这对您来说太耗时了。

          我会先寻找一些倒排列表的实现。

          【讨论】:

            【解决方案8】:

            一个简单的解决方案是一个数据库,您可以在其中存储一个 ID、路径和一个 varchar(字符串)字段,您将在其中保存所有关键字。 (为了提高效率,可以将其存储在不同的表中)

            这样您就可以按文件名或与图像关联的关键字进行搜索。

            【讨论】:

              【解决方案9】:

              只需将所有图像重命名为由空格分隔的相应关键字即可。然后使用操作系统自带的搜索功能。

              如果这不起作用,那么只有寻找更好的解决方案。

              【讨论】:

                猜你喜欢
                • 2012-10-06
                • 1970-01-01
                • 1970-01-01
                • 2012-01-07
                • 2015-11-04
                • 1970-01-01
                • 2015-01-15
                • 2015-09-07
                • 2011-05-31
                相关资源
                最近更新 更多