QGISでタイル作成したタイル画像で不要なタイル画像を削除する方法をまとめました。
透過のみのタイル画像というよりも、1カラーだけのタイル画像を削除する方法になっています。
厳密に透過画像のみを削除したい場合には、identifyの出力内容を調整する必要があります。
QGISで簡単にタイル画像を作成しようと思って、QTilesやQMetaTilesプラグインでタイルを作成したまでは良かった。
おぉ~!タイル画像が出来てるではないか!!
と、意気揚々で「次はこれ作ってぇ~!」とかお願いしていたら・・・・
やたら時間は掛かるんだけどねw
で、しばらくお願いして放置していたら・・・
「なんかエラーが出て、出来ません。」との連絡が。
なんで?
見てみると、ディスクがパンパン(爆)
よく見ると、タイル画像が重すぎて一杯やないですか!
でも部分的に削除すると言っても・・・・と悩みながらも、透過しているだけのタイル画像は必要ないわなw
どうやって判定しようかなぁ?
ちょうど、そのWindowsマシンには下記のツールが入っていた。
- ImageMagick
Linuxで画像弄るなら必須アイテム。Windows版も当然ある。 - Gow
Linux風のコマンドを使えるようにするツール。
で、使ったのがこんなコマンド
identify
今回扱った画像には以下の条件がある。
①PNG画像
②1つのタイル画像に含まれる色は、対象物があった場合は2色以上になる。
③対象物が無い場合は透過のみとなるため、1色のみになる。
上記を整理すると、「単色のpng画像は不要」ということになる。
で、どうやってそのリストを作って削除するか・・・・
まずはWindowsでやってみた。
以下のバッチファイルを準備する。
1 2 3 4 5 6 |
REM chk_1color.bat echo off for /r . %%i in ( *.png ) do ( identify -format "rm %%d/%%f %%kcolor" %%i | grep " 1color" | sed -e s/1color//g ) |
Gowを入れると、xargsやsedなどLinux標準のコマンド類が使える様になります。sedのみを使いました。
xargsを使って渡せば簡単じゃないか!と思われますが、これがWindows側の「|(パイプ)」とxargsの相性が悪く、受け渡す標準出力を溜めこんでします様です。
その為、大量のファイルを扱う場合には、ファイルのパスがバッファに積まてしまいエラーが発生するという問題を解決出来ませんでした。
使い方はこんな感じです。
タイル画像のあるフォルダーの根元に移動してから、この以下のコマンドを実行します。
1 2 |
①chk_1color.bat > run_del.bat ②run_del.bat |
①で削除対象ファイルの削除用コマンドをrun_del.batファイルへ書き出します。
それを②で実行する。
それだけですw
せっかくここまで読んで頂いたのに済みませんが、時間にメッチャ余裕のある方や、タイルファイル数がそれ程多くない方はこれでも全然OKです。
でも、タイル数が数十万とか数百万とかになってくると、Windowsのコマンドプロンプトは使い物になりません。
Power Shellを使え?とか言わないでください。信用してませんからw
で、仕方が無いのでLinuxにファイルをコピーしてから同じことをLinux上で実施して、結果をダウンロードしてくることにしました。
下手すりゃ、ファイル共有掛けて実行してもそこそこLinuxの方が速いかも知れないのですが・・・・
確実に速かったのでこれにした。
まずは、全てのファイルを圧縮しようと思うのですが、7zを使いました。
とは言え、数百万ファイルのファイルを圧縮するには相当な時間が掛かりますし、纏まったファイルの容量もデカくて取り扱いが不便です。
こまめに分けました。
それぞれのフォルダー毎に圧縮ファイルを作成します。
1 |
dir /AD /B | xargs -I XXX 7z a XXX.7z XXX |
これでフォルダー単位の圧縮ファイルが作成されます。
圧縮ファイルをLinuxに転送します。
転送したファイルを今度はLinux上で解凍します。
1 |
7za x *.7z |
次に、以下のコマンドで透過(1つのカラーだけ)のファイルを削除します。
1 |
find . -name *.png | xargs -I XXX identify -format "%d/%f @%kcolor" XXX | sed "s/@1color//g" | rm |
Windows環境でやる何倍も速く実行できます。