別の画像内で特定の画像の位置を取得するには?

別の画像内で特定の画像の位置を取得するには?

各スクリーンショットに同じグラフィックを含むPNGスクリーンショットがたくさんあります。作品はすべての画像で同じサイズを持っています。

各ファイルの場所を見つけるためにどのコマンドラインプログラムを使用できますか(1つずつ入力)?

ベストアンサー1

以下はおおよそのアイデアに過ぎず、既製の解決策はありません(特にコードがない場合!)。

小さなグラフィックとスクリーンショットのサンプルを生(圧縮されていない)形式に変換します(熱重量分析圧縮はまったくなく、すべてのピクセルを完全にダンプしたものです。次に、grepを使用してスクリーンショットファイル内のグラフィックを見つけます。次に、位置を計算します。

identify計算を実行するには、Image Magickのコマンドを使用して取得できる画像のサイズ(幅と高さ)が必要です。それは:

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

grepまた、MathewRockのコメントのように行単位で保存され、スクリーンショットのピクセルで囲まれているため、グラフ全体を一度に検索することはできません。行単位で検索する必要があります。グラフィックスが見つかると、Xピクセル分2番目の行をさらに検索します。ここで、Xはスクリーンショットの幅からグラフィックの幅を引いたものです。

grepこのオプションは、Kピクセルで改行で区切られたグラフィックファイルと一緒に使用する必要があります-F。ここで、Kはグラフィック幅に色深度を掛けたバイト単位である。headこれを使用して実行してくださいtail。色深度が8ビットの場合、各ピクセルラインの長さはKバイトであり、カラー深度が24ビットまたは3バイトなどより高い場合、ピクセルラインの長さはK x 3バイトです。

ライン10は、長さが20ピクセル、色の深さが3バイトで、次のように取得できます。

head -c $((10*20*3)) graphic.colorinfo | tail -c 60

もちろん、これをシェルコードで書くのは、いくつかのケースでは少し複雑かもしれません。たとえば、スクリーンショットが(グラフィックと同様に)完全に白色の単色で、グラフィックに黒いピクセルが1つしかない場合です。

一時開始座標(最初の行の一致の左端と一番上のピクセル位置)を保存し、1つの行が一致しなくなるまでそこから下の行を検索し、次の一致の最初の行から始めるのがアイデアです。など。 。

ついに16進エディタのようなバイトレベル(テキストツールを使用した画像操作には適していません)でこれを行う方がはるかに簡単になると思います。あるいは、CやPythonを使用する方が良いでしょう。しかし、方法は同じです(一致する行を検索)。

おすすめ記事