2015/01/27(火)ImageMagickライブラリによる塗りつぶし
2017/10/12 18:51
これは、筆者が開発作業で制作した、気象庁によるXML配信データを基に生成した、日本近海の海上(気象)警報を視覚化したものです。
( https://www.basekernel.jp/pc/weather/fishcond/index.html )
図中の黄色や橙色、水色は、閉塞領域の単純な塗りつぶしですが、このような簡単な事例が検索してもなかなか出てこない。
昔のパソコンで一般的だった BASIC だと、
paint(X,Y), colorcode,bordercolor1,bordercolor2みたいにするだけで任意の座標 X,Y を含む bordercolor で示す閉塞領域をcolorcode で塗りつぶすことが出来たのですが、これと同じことをする手法が判らない。
結局、 ImageMagick の本家でそれらしきものを見つけて、わかりにくい説明を基に試行錯誤しました。
いつもの例によって Perl でのやり方ですが、
use Image::Magick ; # 画像描画ライブラリ使用宣言で、ライブラリを宣言し、
$image = new Image::Magick ; # 操作オブジェクト生成 $image->Read('seamap.png') ; # 元の画像ファイルを読み込む $image->FloodfillPaint(x => $position_x, y => $position_y, channel => All, fuzz => '20%', fill => $paintcolor) ; $image->Write('seamap.png') ; # 操作後の画像をファイルに書きだす undef ($image) ;のようにします。
書き出す際のファイル形式は、読み込んだときのファイル形式がデフォルトになるようですが、詳しく検証していません。
FloodfillPaint という関数呼びだしが塗りつぶし処理そのもの。
x に塗りつぶしたい領域を含むX座標(水平方向の座標)、
y に塗りつぶしたい領域を含むY座標(垂直方向の座標)、
fill に塗りつぶしたい色を、rgb文字列形式で指定します。
#ff0000 とすれば赤、#00ff00 とすれば明るい緑、#0000ff とすれば青、
#ffff00 とすれば黄、#ffffff とすれば白、#000000 とすれば黒、
といった具合です。
fuzz は、境界のあいまいさのようなもので、この数値を減らせば境界色判定がシビアになり、数値を増やすと、多少違った色でも塗りつぶしを行うようになります。
fuzz の数値は、実際に試しながら設定するのが早いです。