Windows 7 二维码混合瓷砖的逆向工程

Windows 7 二维码混合瓷砖的逆向工程,windows-7,imagemagick,qr-code,Windows 7,Imagemagick,Qr Code,我有25块瓷砖,每一块94x94px,都是先前分割的二维码(470x470px)。我需要通过将所有可能的瓷砖组合成一幅图像来恢复二维码。3瓷砖假定为“锚”或位于西北、东北和西南角的大正方形。因此,我们还有22块位置未知的瓷砖。如何使用ImageMagick生成所有可能的组合 更新: 我的第一种方法是生成包含所有组合的文本文件(稍后将作为输入提供给),同时考虑静态方块(NW、NE和SW角)。我很难理解如何与IM命令行界面交互。如何通过命令传递文本文件来告诉IM做什么 更新2 感谢Kurt Pfei

我有25块瓷砖,每一块94x94px,都是先前分割的二维码(470x470px)。我需要通过将所有可能的瓷砖组合成一幅图像来恢复二维码。3瓷砖假定为“锚”或位于西北、东北和西南角的大正方形。因此,我们还有22块位置未知的瓷砖。如何使用ImageMagick生成所有可能的组合

更新:

我的第一种方法是生成包含所有组合的文本文件(稍后将作为输入提供给),同时考虑静态方块(NW、NE和SW角)。我很难理解如何与IM命令行界面交互。如何通过命令传递文本文件来告诉IM做什么

更新2

感谢Kurt Pfeifle的澄清。事实上,这样做需要大量的时间和资源。也许我可以用老式的方式来做。解决所有谜题的方法是:打印出来,手动切割成25块,然后合并。我知道这听起来很荒谬,但这是目前我能想到的唯一可能的解决办法。如果我决定这样做,我需要知道二维码是如何生成的规则。我知道三边的大正方形的位置。我还需要知道什么

也许还有更优雅的方式?(请不要建议拆分为平铺并导入到Photoshop。已尝试。浪费了很多时间。)

更新3

这是我用ImageMagick分割的二维码和瓷砖

更新4

我怀疑QR已被顺时针旋转180度,因为大正方形有白色空间,最有可能位于NE、SW和SE角。我不确定是否对每个瓷砖应用了旋转,但就我在Photoshop中使用它们而言,至少有7个瓷砖没有旋转对齐(*但不是100%确定)

更新5

据我所知,编写算法有点棘手,但比暴力搜索更有帮助。约束应该是这样的:
1.2个连接块的线的宽度和高度必须对应于px的某个范围(例如:如果产生1px线或点,则无法连接2个块)

更新6


谢谢你,先生!我从关于角元素的错误假设开始,这是我的问题,导致我一事无成。在我了解了角元素应该如何放置在其他位置后,我在Photoshop中花了几分钟的时间。尽管角块的位置不正确,但我还是将大约10个元素对齐到了一个大块中。现在,我要提出一种算法,根据一组规则(Python+ImageMagick的MagickWand API)完全自动对齐这些磁贴。

前面的任务是一般数学领域组合数学的一个特例。(对不起,我不是以英语为母语的人,也不是数学家。所以我不确定这是否是该领域正确的英语专业术语。)

组合数学有一些经过普遍验证的规则,即如果对象有N个插槽,并且每个对象必须一次放入一个插槽中,那么N个不同对象可能有多少个组合/顺序

首先以最简单的示例为例:1个元素,1个插槽。只有一个选择

接下来,两个元素:a+b和两个插槽:1+2。有两种选择:

  • a、 b
  • b、 a
  • 三个元素:a+b+c,三个插槽:1+2+3。现在有六种选择:

  • a、 b,c
  • a、 c、b
  • b、 a,c
  • b、 c,a
  • c、 a,b
  • c、 b,a
  • 此一般规则(可通过应用通用数学证明方法轻松证明)为:

    “对于
    N
    元素,有
    N!
    不同的排列方式。”

    其中
    N
    表示N的阶乘,表示所有小于或等于
    N
    的正整数的乘积。例如:

    5! = 5 * 4 * 3 * 2 * 1 = 120
    
    如您所见,阶乘函数的增长相当快…:-)

    您的一般要求相当于将22块瓷砖放入22个位置。一声——哈!,哈!:)——计算表明

    22!=1.124.000.727.777.607.680.000

    22的长度(巧合!)为22位。它还包含4个尾随零(占总数的18.18%)

    因此,我建议我们分享一些工作:

  • 您的部分是:请开始生成或编写您在问题中建议的“包含所有组合的文本文件”
  • 我的部分:在您完成该部分时,我将能够为您提供一个简单的shell脚本,以生成您正在查看的所有二维码
  • <>但是在你开始用所有的组合编写你的文本文件之前,请考虑这个:

  • 我的脚本将逐行读取文本文件作为输入
  • 每行将运行trigger 1 ImageMagick命令以生成相应的二维码图像
  • 因此,您需要提供一个包含1.124.000.727.777.607.680.000行不同内容的文本文件
  • 由于文本文件的所有行都需要彼此不同(否则它们将表示两个或更多组合的Dublette),因此它们至少需要23个字节(22个字节来命名22个不同的平铺名称——您可以将它们命名为单个字母——加上一个EOL/CR/NL字符)
  • 因此,文本文件的最小长度为2.4728016*1022字节
  • 因此,在开始写入文件之前,请确保您的计算机有足够的硬盘空间来保存该文件
  • 磁盘需要能够容纳230亿TB(仅对于文本文件而言)!这是23(同样,国家安全局在其内部为自己创造了多少存储空间?)
  • 哦,当你在这里的时候,当你购买大型硬盘时,也许你也可以考虑我们需要的空间,因为我的IMAGE脚本会产生所有的QR代码图像… 我想是的
     for i in $(seq -w 1 25); do
       saturation="$(( $(echo x${i} | sed 's#x0*##') * 10 ))"
       color="srgb(${saturation},${saturation},${saturation})"
    
       convert          \
         -size 100x100  \
          xc:"${color}" \
          graypatch_${i}.png
      done
    
     montage            \
       -geometry +1+1   \
        graypatch_*.png \
        grid1.png
    
     montage            \
       -geometry +1+1   \
        $(ls -1 graypatch_*.png | sort -R) \
        grid2.png
    
    11 17 22 13 24 18 21 7 2 9 14 0 20 3 10 15 5 1 12 23 6 16 8 19 4