使用 .NET 中的 pHash

Posted

技术标签:

【中文标题】使用 .NET 中的 pHash【英文标题】:Using pHash from .NET 【发布时间】:2011-09-09 09:54:48 【问题描述】:

我正在尝试使用来自 .NET 的 pHash

我尝试的第一件事是注册 (regsvr32) phash.dll 并询问 here 其次,我尝试使用DllImport 导入,如下所示。

    [DllImport(@".\Com\pHash.dll")]
    public static extern int ph_dct_imagehash(
        [MarshalAs(UnmanagedType.LPStr)] string file, 
        UInt64 hash);

但是当我尝试在运行时访问上述方法时,会出现以下错误消息。

    Unable to find an entry point named 'ph_dct_imagehash' in DLL '.\Com\pHash.dll'.

“入口点”是什么意思,为什么会出现错误?

谢谢。

仅供参考 - 这是完整的源代码

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;

namespace DetectSimilarImages

    public partial class MainWindow : Window
    
        [DllImport(@".\Com\pHash.dll")]
        public static extern int ph_dct_imagehash(
            [MarshalAs(UnmanagedType.LPStr)] string file, 
            UInt64 hash);


        public MainWindow()
        
            InitializeComponent();

            Loaded += MainWindow_Loaded;
        

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        
            try
            
                UInt64 hash1 = 0, hash2 = 0;
                string firstImage = @"C:\Users\dance2die\Pictures\2011-01-23\177.JPG";
                string secondImage = @"C:\Users\dance2die\Pictures\2011-01-23\176.JPG";
                ph_dct_imagehash(firstImage, hash1);
                ph_dct_imagehash(secondImage, hash2);

                Debug.WriteLine(hash1);
                Debug.WriteLine(hash2);
            
            catch (Exception ex)
            

            
        


    

【问题讨论】:

你自己编译了DLL吗?如果是这样,您是否注意正确导出相关功能? @konrad:我自己编译了源代码,但我不知道你所说的“正确导出相关函数”,因为我根本不熟悉 C++... @Sung 那么解决方法很简单:不要自己编译库。使用预编译的二进制文件。 不幸的是,即使使用预编译的 dll,我仍然无法解决 Unable to find an entry point named 'ph_dct_imagehash' in DLL '.\Com\pHash.dll'. 错误 @ildjam:谢谢你提到它。我也不确定,所以我联系了 pHash 开发人员,他告诉我 DllImport 语句应该像 [DllImport("pHash", CharSet=CharSet.Ansi)] public static extern int ph_dct_imagehash(string file, ref ulong hash); 【参考方案1】:

phash.org 上的当前 Windows 源代码项目(截至 2011 年 7 月)似乎没有从 DLL 导出 ph_ API 调用。您需要在 pHash.h 的行首通过 __declspec(dllexport) 自己添加这些,如下所示:

__declspec(dllexport) int ph_dct_imagehash(const char* file,ulong64 &hash);

然后,您应该会看到使用dumpbin 显示在 DLL 中的导出

dumpbin /EXPORTS pHash.dll
...
Dump of file pHash.dll
...
          1    0 00047A14 closedir = @ILT+2575(_closedir)
          2    1 00047398 opendir = @ILT+915(_opendir)
          3    2 00047A4B ph_dct_imagehash = @ILT+2630(_ph_dct_imagehash)
          4    3 000477B2 readdir = @ILT+1965(_readdir)
          5    4 00047A00 rewinddir = @ILT+2555(_rewinddir)
          6    5 000477AD seekdir = @ILT+1960(_seekdir)
          7    6 00047AFA telldir = @ILT+2805(_telldir)

您现在应该可以在 C# 中使用此调用了。

不过……

当我尝试调用它时,我在 CImg 代码中遇到了崩溃,所以似乎有一些 more work to do here...

【讨论】:

这在 png_read_info() 中对我来说会崩溃,但对于 JPG 来说似乎可以正常工作 PNG 似乎需要一些额外的步骤:***.com/questions/4001816/loading-pngs-with-cimg 我在执行 dumpbin 后能够看到 ' 3 2 00047A4B ph_dct_imagehash = @ILT+2630(_ph_dct_imagehash) ',但我仍然无法 dllimport phash.dll。 这里发生的事情是,我没有全部依赖 dll 和其他库。解决了这个问题后,现在我又遇到了一个错误

以上是关于使用 .NET 中的 pHash的主要内容,如果未能解决你的问题,请参考以下文章

使用 pHash 搜索一个巨大的图像数据库,最好的方法是啥?

安装 pHash 库时对“fftw_init_threads”的未定义引用

erlang node_name phash 冲突坑

图片对比 感知哈希法(pHash)

python 将phash得到的64位数据转换成BIGINT方便存储到数据库

感知哈希算法