我有很多 PNG 屏幕截图,每个屏幕截图中都有一张相同的图形。该作品在所有图像中都具有相同的尺寸。
我可以使用什么命令行程序来查找它在每个文件中的位置(一个一个地输入)?
答案1
以下只是一个粗略的想法,没有现成的解决方案(尤其是没有代码!)。
我会将小图形和屏幕截图的样本转换为原始(未压缩)格式(热重分析绝对没有压缩,它只是每个像素的完整转储),然后 grep 查找屏幕截图文件中的图形。然后计算位置。
为了进行计算,您需要图像的尺寸(宽度和高度),您可以使用 Image Magick 的identify
命令获得这些尺寸。那是:
GRAPHIC_WIDTH=$(identify -verbose graphic.tga | sed -n '/Geometry:/s%.*Geometry:\ \(.*\)x.*%\1%p')
GRAPHIC_HEIGHT=$(identify -verbose graphic.tga | sed -n '/Geometry:/s%.*x\([^+]*\)+.*%\1%p')
TGA 文件的前 18 个字节不包含像素信息,因此应省略:
tail -c +19 graphic.tga > graphic.colorinfo
而且,正如 MatthewRock 的评论中那样,您不能grep
一次查找整个图形,因为它是逐行保存的,并且周围都是屏幕截图中的像素,您应该逐行搜索,即搜索图形的第一个像素行,如果找到,则进一步搜索第二行 X 像素,其中 X 是屏幕截图的宽度减去图形的宽度。
您应该使用grep
该选项-F
和一个由 K 像素处的换行符分隔的图形文件,其中 K 是图形的宽度乘以其颜色深度(以字节为单位)。使用head
和执行此操作tail
。如果颜色深度为 8 位,则每个像素线的长度为 K 字节,如果颜色深度更高,例如 24 位或 3 字节,则像素线的长度为 K 乘以 3 字节,依此类推:
第 10 行长 20 像素,颜色深度为 3 字节,可以通过以下方式获得:
head -c $((10*20*3)) graphic.colorinfo | tail -c 60
当然,在某些情况下,用 shell 代码编写这种方法会有些复杂,例如,如果屏幕截图完全是单色白色(图形也是如此),并且图形只有一个黑色像素。
这个想法是保存临时起始坐标(第一行匹配的最左边和最上面像素的位置),并从那里搜索下面的行,直到一行不匹配,然后从下一个匹配的第一行开始,等等。
最后我不得不说,在字节级别上执行此操作会容易得多(不适用于使用文本工具处理图像),例如十六进制编辑器。或者更好地使用 C 或 python。但方法是相同的(搜索匹配行)。