Vextractor 的另类破解方法

1. Vextractor 简介
    Vextractor 是 http://www.vextrasoft.com/ 出品的一个能够自动的把栅格数据批量的转换为矢量数据的一个软件。
    根据我的具体使用,我觉得它在某些地方做得比 R2V 或其它自动矢量化软件做得要好。首先,Vextractor 用来在矢量化地图的路线,路线是连贯的,而且路线拐角的地方判断的比较正确。如图 1,这是一个城市道路的地图的一部分,用 Vextractor 自动矢量化之后,得到图 2 的效果;用 R2V 自动矢量化得到图 3 的效果。为了方便对比,我都把自动矢量化的结果存为 MapInfo 的交换格式 MIF 格式的文件中。
Vextractor 的另类破解方法_第1张图片
图1


Vextractor 的另类破解方法_第2张图片
图2


Vextractor 的另类破解方法_第3张图片
图3

    在 MapInfo 中导入矢量化的数据之后,可以发现,图 1 中最粗的那一条主干道,在 Vextractor 矢量化的结果中是一条连续的线。图 2 中可以看出,在 MapInfo 里面点这条主干道之后,它是一条连续的线。但是用 R2V 自动矢量化出来的结果中可以发现,R2V 并没有把这个主干道处理成一条连续的线,而是在每个路线的交叉点都会分开成许多的线段。显然,哪个效果更好就可想而知了。

2. Vextractor 的 Demo 版本中的限制
    Vextractor 的试用版本中,几乎没有什么功能上的限制。在想要保存矢量化之后的数据的时候,它会提示“试用版对保存的大小会有限制”。但是似乎它的这个限制的大小不是很小,我用来矢量化一幅 3211x4733 像素的地图的时候也非常的正常。但是它会在自动矢量化之后,保存下来的矢量数据里面添加“水印”。如图 4。
Vextractor 的另类破解方法_第4张图片
图4


3. Vextractor 设置的“水印”的分析
    这里,为了方便说明我把它矢量化的数据保存为 MIF 格式的文件,以此为例,其它的文件格式也类似的。
    我用 ACD FotoCanvas 来新建了一幅 300x300 的白色背景的图片(如图 5),然后在里面画了一根简单的直线。把它保存下来之后,用 Vextractor 打开,然后自动矢量化,之后保存矢量数据为 MIF 格式的文件。
Vextractor 的另类破解方法_第5张图片
图5

Vextractor 的另类破解方法_第6张图片
图6

    用 MapInfo 打开后可以看到矢量数据是如下形式,如图 6。其中多了两个 Vextractor 添加进去的东西。现在打开刚才那个 MIF 文件来看看。内容如下:


Version 300
Delimiter ","
CoordSys NonEarth Units "m"
  Bounds
(0.145833,1.218750) (2.208333,2.927083)                                                                                                 
Columns 1
Number integer

Data
Pline 2
0.843750 1.572917
2.208333 2.927083
Pline 2
0.145833 1.781250
0.187500 1.677083
Pline 2
0.187500 1.677083
0.447917 1.812500
Pline 2
0.447917 1.812500
0.500000 1.718750
Pline 2
0.500000 1.718750
0.656250 1.958333
Pline 2
0.656250 1.958333
0.375000 1.958333
Pline 2
0.375000 1.958333
0.416667 1.875000
Pline 2
0.416667 1.875000
0.145833 1.781250
Pline 2
0.208333 1.625000
0.395833 1.218750
Pline 2
0.395833 1.218750
0.593750 1.218750
Pline 2
0.593750 1.218750
0.864583 1.781250
Pline 2
0.864583 1.781250
0.791667 1.958333
Pline 2
0.791667 1.958333
0.500000 1.375000
Pline 2
0.500000 1.375000
0.343750 1.697917
Pline 2
0.343750 1.697917
0.208333 1.625000
Pline 2
1.187500 1.781250
1.229167 1.677083
Pline 2
1.229167 1.677083
1.489583 1.812500
Pline 2
1.489583 1.812500
1.541667 1.718750
Pline 2
1.541667 1.718750
1.697917 1.958333
Pline 2
1.697917 1.958333
1.416667 1.958333
Pline 2
1.416667 1.958333
1.458333 1.875000
Pline 2
1.458333 1.875000
1.187500 1.781250
Pline 2
1.250000 1.625000
1.437500 1.218750
Pline 2
1.437500 1.218750
1.635417 1.218750
Pline 2
1.635417 1.218750
1.906250 1.781250
Pline 2
1.906250 1.781250
1.833333 1.958333
Pline 2
1.833333 1.958333
1.541667 1.375000
Pline 2
1.541667 1.375000
1.385417 1.697917
Pline 2
1.385417 1.697917
1.250000 1.625000

    前面的几行是一些头信息,在这里可以不管它们。从“Data”的下一行开始才是表示那些矢量信息的数据。“Pline 2”表示这个对象是一个线段,有两个点表示。如果是“Pline 3”就有 3 个点表示。所以我们这里,“Pline 2”接下去那一行应该有两个点位信息。
    我们刚才画的那条直线是一条简单的直线段,只要头尾两个点位信息就可以确定了。如图 6,我们可以数出图中一共有 29 条线段,在以上数据中,我们确实可以数出 29 条线。看来 Vextractor 只是简单的把它的“水印”附加到这些矢量数据里面。因此,我们只要把它这些“水印”的相关点位信息删除就可以去除这些“水印”了。
    我们试着把 MIF 文件中的第一个线段信息删掉,会发现我们原来画的直线没有了,只剩下 Vextractor 的“水印”。也许 Vextractor 的这些“水印”数据是直接添加在原始数据的后面的。
    经过大量实验的验证,确实 Vextractor 的“水印”数据是直接添加在它矢量化出来的数据的后面的,而且数量随着整幅图的大小而变化。

4. Vextractor “水印”的去除
    其实要去除它的“水印”也不算难,只要找到第一个“水印”数据的位置,把后面的数据都删除就行了。现在的问题就是如何找到第一个“水印”数据的位置。
    Vextractor 的“水印”每一个都是一样的,每条线都是有固定的方向的。这样,只要计算矢量数据中两点线段的斜率,然后统计连续的几个两点线段的斜率,只要它们呈一定的规律,那么它们就是“水印”数据。
    如下的这 14 个线段就能组成一个 Vextractor 的“水印”标志。

Pline 2
0.145833 1.781250
0.187500 1.677083
Pline 2
0.187500 1.677083
0.447917 1.812500
Pline 2
0.447917 1.812500
0.500000 1.718750
Pline 2
0.500000 1.718750
0.656250 1.958333
Pline 2
0.656250 1.958333
0.375000 1.958333
Pline 2
0.375000 1.958333
0.416667 1.875000
Pline 2
0.416667 1.875000
0.145833 1.781250
Pline 2
0.208333 1.625000
0.395833 1.218750
Pline 2
0.395833 1.218750
0.593750 1.218750
Pline 2
0.593750 1.218750
0.864583 1.781250
Pline 2
0.864583 1.781250
0.791667 1.958333
Pline 2
0.791667 1.958333
0.500000 1.375000
Pline 2
0.500000 1.375000
0.343750 1.697917
Pline 2
0.343750 1.697917
0.208333 1.625000

    每一个线段都是这样的格式:

Pline 2
X1 Y1
X2 Y2

    那么我们就能计算出每一段线的 k = (x1 - x2)/(y1 - y2),得到如下数据:

k1=-0.400002
k2=1.923075
k3=-0.555552
k4=0.652175
k5=0.000000
k6=-0.500006
k7=2.888896
k8=-0.461538
k9=0.000000
k10=0.481481
k11=-0.411762
k12=0.500001
k13=-0.483870
k14=1.857139

    这样,编写一个程序打开矢量化得到的 MIF 文件,从第一行开始找,找到一个“Pline 2”就计算它的 k 值与 k1 对比,如果符合然后如果下一个对象还是“Pline 2”,同样计算它的 k 值与 k2 对比;如果不是的话就重新找符合 k1 的线段……依此类推直到找到连续的 14 个 k 值都是符合以上条件的,那么这 14 条线段就是它的“水印”数据,删掉既可。

5. 加强保护的简单设想
    Vextractor 虽然在保存的数据中加入了“水印”,但是,每一个“水印”的标志都是一样的,因此容易被找到规律,然后可以批量的删除。如果加入的“水印”都是不一样的,比如加入的每一个标志都转动一个随机方向,并且随机插入到那些矢量数据中,这样就难以用以上的方法计算出 k 值来批量的删除“水印”。

你可能感兴趣的:(Integer,破解)