「ImageMagick」カテゴリーアーカイブ

QTiles/QMetaTiles Pluginで作成したタイル画像の要らない部分を削除する

QGISでタイル作成したタイル画像で不要なタイル画像を削除する方法をまとめました。
透過のみのタイル画像というよりも、1カラーだけのタイル画像を削除する方法になっています。
厳密に透過画像のみを削除したい場合には、identifyの出力内容を調整する必要があります。

QGISで簡単にタイル画像を作成しようと思って、QTilesやQMetaTilesプラグインでタイルを作成したまでは良かった。

おぉ~!タイル画像が出来てるではないか!!

と、意気揚々で「次はこれ作ってぇ~!」とかお願いしていたら・・・・
やたら時間は掛かるんだけどねw

で、しばらくお願いして放置していたら・・・

「なんかエラーが出て、出来ません。」との連絡が。

なんで?

見てみると、ディスクがパンパン(爆)

よく見ると、タイル画像が重すぎて一杯やないですか!

でも部分的に削除すると言っても・・・・と悩みながらも、透過しているだけのタイル画像は必要ないわなw

どうやって判定しようかなぁ?

ちょうど、そのWindowsマシンには下記のツールが入っていた。

  • ImageMagick
    Linuxで画像弄るなら必須アイテム。Windows版も当然ある。
  • Gow
    Linux風のコマンドを使えるようにするツール。

で、使ったのがこんなコマンド

identify

今回扱った画像には以下の条件がある。

①PNG画像
②1つのタイル画像に含まれる色は、対象物があった場合は2色以上になる。
③対象物が無い場合は透過のみとなるため、1色のみになる。

上記を整理すると、「単色のpng画像は不要」ということになる。

で、どうやってそのリストを作って削除するか・・・・

まずはWindowsでやってみた。
以下のバッチファイルを準備する。

Gowを入れると、xargsやsedなどLinux標準のコマンド類が使える様になります。sedのみを使いました。
xargsを使って渡せば簡単じゃないか!と思われますが、これがWindows側の「|(パイプ)」とxargsの相性が悪く、受け渡す標準出力を溜めこんでします様です。
その為、大量のファイルを扱う場合には、ファイルのパスがバッファに積まてしまいエラーが発生するという問題を解決出来ませんでした。

使い方はこんな感じです。

タイル画像のあるフォルダーの根元に移動してから、この以下のコマンドを実行します。

①で削除対象ファイルの削除用コマンドをrun_del.batファイルへ書き出します。
それを②で実行する。

それだけですw

せっかくここまで読んで頂いたのに済みませんが、時間にメッチャ余裕のある方や、タイルファイル数がそれ程多くない方はこれでも全然OKです。
でも、タイル数が数十万とか数百万とかになってくると、Windowsのコマンドプロンプトは使い物になりません。
Power Shellを使え?とか言わないでください。信用してませんからw

で、仕方が無いのでLinuxにファイルをコピーしてから同じことをLinux上で実施して、結果をダウンロードしてくることにしました。

下手すりゃ、ファイル共有掛けて実行してもそこそこLinuxの方が速いかも知れないのですが・・・・

確実に速かったのでこれにした。

まずは、全てのファイルを圧縮しようと思うのですが、7zを使いました。

とは言え、数百万ファイルのファイルを圧縮するには相当な時間が掛かりますし、纏まったファイルの容量もデカくて取り扱いが不便です。
こまめに分けました。

それぞれのフォルダー毎に圧縮ファイルを作成します。

これでフォルダー単位の圧縮ファイルが作成されます。

圧縮ファイルをLinuxに転送します。

転送したファイルを今度はLinux上で解凍します。

次に、以下のコマンドで透過(1つのカラーだけ)のファイルを削除します。

Windows環境でやる何倍も速く実行できます。

 

 

 

画像に右下にタイムスタンプを付ける。

画像にタイムスタンプを付けようと思います。

Linuxユーザで画像処理を行う場合の必須アイテムと言えば、ImageMagickですよね。

既にたくさんブログがあると思うのですが、ここは私の備忘録ということで、簡単に(^^ゞ

ImageMagickは標準ではインストールされていませんが、yumを使えば簡単にインストールできます。

既に私の環境にはインストールされていたの、うろ覚えですが・・・

こんだけじゃないかな?
間違っていたらごめんなさいm(__)m

取りあえず、準備が整ったら、以下のコマンドを実行してください。
設定内容は以下の通り。

コマンドにするとこんな感じ

設定項目 項目 設定内容
入力画像 hogehoge.jpg
文字サイズ -pointsize 48ポイント
文字塗潰し -fill 白(white)
文字外枠幅 -strokewidth 1
文字外枠色 -stroke 黒(black)
文字位置 -gravity 右下(SouthEast)
文字位置補正 -annotate XY方向にオフセット(+40+40)
描画文字列 後で説明
フォント -font arial.ttf
(多分入ってる)
出力ファイル out.jpg

コマンドにするとこんな感じです。

-annotateは文字の傾きを指定するのに使用している例が多くみられるのですが、今回は傾きは必要なく、オフセット位置をしていたいだけなので、+40+40としました。
画像サイズなどに応じて適宜変更が必要です。

-gravityは画像の上(北:North)/下(南:South)/右(東:East)/左(西:West)とし、それぞれの組み合わせたりして使います。
今回は右下に付けたかったので、SoutEastとしました。
その補正位置(オフセット)を-annotateで指定しています。

描画文字列については、単純に文字列を記載すれば良いのですが、今回はタイムスタンプを入れたかったので、ファイルの生成時刻を元に入れました。
dateコマンドの-rオプションでファイルを指定することで、ファイルの生成時刻を取得しています。

画像情報から時刻を取得する場合はこんな感じかな?

長ったらしくなりましたね。
シェル作った方が賢いかな?

取りあえず説明。
以下の部分で画像情報を取り出して、そこから更新日付を抜き出して加工しています。

ImageMagickに含まれているidentifyを使って画像情報を取り出しています。
編集内容については、画像情報の内容を見てから最終的に変更する必要があるかも知れませんので、単純にこのコマンドで実現できるかどうかは環境依存と考えてください。

というこで、今回はこの程度。