大きな (最大 16384x16384px) 画像を小さなチャンク (通常は 512x512) に分割する必要があります。これを行うために、以下の単純な perl スクリプトを使用しています。
#!/usr/bin/perl
use warnings;
use strict;
my $size = '512x512';
unless ($ARGV[0]) { die "Missing filename as arg" }
unless (-e $ARGV[0]) { die "$ARGV[0] not found.\n" }
my ($newfile, undef) = split(/\./,$ARGV[0]);
system("convert $ARGV[0] -crop $size $newfile" . "_%03d.png");
ここで、たとえば 1024x1024 のソース画像の場合、元の画像の位置オフセットを含む小さな断片のインデックスを作成する必要があります。
image_000.png 0,0
image_001.png 512,0
image_002.png 0,512
image_003.png 512,512
...または似たようなもの。基本的には、特定の各チャンクが元の画像にあった位置を追跡するだけです。
convert
コマンドが渡されたので、system()
ファイルのグロブを実行してそれらをソートすることを考えていました。いくつかの簡単な実験では、小さなチャンクが左から右、上から下の順序で (直感的に) 番号付けされ、に基づいてインデックスを構築することが示されています。それは、しかし、ImageMagick への perl 独自のインターフェイスを含む、もっと単純なものがあるに違いないと私は考えています
だから私の質問は次のとおりです。
1.Image::Magick
に相当するものは何convert $ARGV[0] -crop $size $newfile" . "_%03d.png
ですか?
2. system() 呼び出しを回避できたら、$image オブジェクトのデータに基づいてインデックスを作成することはできますか?
PS:
- チャンク サイズは頻繁に変更されません。512 のハードコーディングは問題ないので、それを抽出する必要はあり
$size
ません ... 実際、なぜその変数を選択したのかまったくわかりません。 - 元の画像サイズは常にチャンク サイズで割り切れるので、残り物について心配する必要はありません。
- glob() のアプローチを難しくするために、画像は常に正方形であるとは限りません。おそらく、
identify
コマンドの 3 列目を使用することを考慮に入れることができますか?