如何使用ImageMagick或GraphicsMagick Node.js从图像获取哈希值?

时间:2019-07-01 20:25:00

标签: node.js npm imagemagick graphicsmagick

仔细阅读这两个节点程序包的文档:

https://github.com/aheckmann/gm

https://github.com/rsms/node-imagemagick

试图找出是否有可能使用图像生成感知哈希。

我已经在我的项目中使用了这些软件包,因此很高兴找到哈希功能,而不是像Jimp那样添加额外的软件包。

任何帮助都将受到高度赞赏!

编辑1:

因此,在查看了你们的所有链接和建议之后,我尝试了以下方法

    gm()
    .command("convert")
    .in("testImage.jpeg")
    .in("-verbose")
    .in("-moments")
    .write( "testOutput.json", function (err) {
        if (!err) {
            console.log("DONE :)");
        }
        else {
            console.log("ERROR :(");
            console.log(err);
        }
    });

这给了我巨大的输出,但是我感兴趣的部分在这里:

"channelPerceptualHash": {
      "colorspaces": [ "sRGB", "HCLp"],
      "Channel0": {
        "PH1": [0.514487, 11],
        "PH2": [3.46339, 11],
        "PH3": [4.96178, 11],
        "PH4": [5.09255, 11],
        "PH5": [10.2783, 11],
        "PH6": [7.0728, 11],
        "PH7": [10.2625, 11]
      },
      "Channel1": {
        "PH1": [0.514487, 11],
        "PH2": [3.46339, 11],
        "PH3": [4.96178, 11],
        "PH4": [5.09255, 11],
        "PH5": [10.2783, 11],
        "PH6": [7.0728, 11],
        "PH7": [10.2625, 11]
      },
      "Channel2": {
        "PH1": [0.514487, 0.514487],
        "PH2": [3.46339, 3.46339],
        "PH3": [4.96178, 4.96178],
        "PH4": [5.09255, 5.09255],
        "PH5": [10.2783, 10.2783],
        "PH6": [7.0728, 7.0728],
        "PH7": [10.2625, 10.2625]
      }
    },
    "renderingIntent": "Perceptual"

根据该线程http://www.imagemagick.org/discourse-server/viewtopic.php?t=30258

如果我没记错的话,我可以对这些PH值进行比较,以确定图像是否相同。

1 个答案:

答案 0 :(得分:2)

对从@ fmw42收到的宝贵建议的回答有所改善

AFAIK,您的2个链接中的第一个更相关,并且已3年未维护,所以我不抱希望。

在命令行中,它将是:

identify -verbose -moments image.png

因此,我下载了这些软件包的源,并像这样搜索momenthashperceptual

find . -type f -exec grep -Ei "moment|hash|perceptual" {} +

唯一的输出与感知哈希无关,仅与一般图像哈希和感知渲染意图无关:

./test/selectFrame.js:  m.identify('%#', function (err, hash1) {
./test/selectFrame.js:    m.selectFrame(2).identify('%#', function (err, hash2) {
./test/selectFrame.js:      assert.ok(hash1.toString().trim() !== hash2.toString().trim())
./test/getterIdentify.js:        assert.equal(d['Rendering intent'], 'Perceptual');

我不抱希望,但很高兴在遇到错误时得到纠正。