2012-05-10 12 views
4

私は巨大なイメージ言う40000x40000ImageMagickの作物巨大な画像

からタイルを作成しようとしています、私は彼がタイルをトリミングImageMagickのためのライン上でスクリプトを見つけました。それは10000x5000のような小さな画像でうまく動作します

私はそれ以上の大きさになると多くのメモリを使用して終了し、コンピュータが死ぬ。

私は、制限オプションを追加したが、彼らは私がそこにモニターを持っていますが、それはそれだけに思えるスクリプトはちょうど遅くとして支援し、マシンに

をlocksupしない

に影響を与える取るように見えるいけませんスワップディスクの50gigのようなものをつくってからマシンを殺す

私は問題がそれをメモリに保存していると考えていると思います。私が必要と思うのは、各タイルをディスクに書き込むことで、メモリにすべてのタイルを保存しないようにするためです。ここ

は、これまで

#!/bin/bash 
file=$1 
function tile() { 
convert -monitor -limit memory 2GiB -limit map 2GiB -limit area 2GB $file -scale ${s}%x -crop 256x256 \ 
-set filename:tile "%[fx:page.x/256]_%[fx:page.y/256]" \ 
+repage +adjoin "${file%.*}_${s}_%[filename:tile].png" 
} 
s=100 
tile 
s=50 
tile 

答えて

7

ImageMagick forumでたくさんの掘削と助けを受けて、私はそれを稼働させることができました。

これを有効にするためのトリックは.mpcの形式です。これはImageMagickが使用するネイティブイメージフォーマットであるため、最初のイメージを変換する必要はなく、必要な部分だけをカットします。これは、第2のスクリプトIのセットアップの場合に当てはまります。

myLargeImg.tifという50000x50000.tifという画像があるとします。

convert -monitor -limit area 2mb myLargeImg.tif myLargeImg.mpc 

次に、タイルを作成するベローズbashスクリプトを実行して、ネイティブイメージ形式に変換します。あなたのフォルダに一度に一つの現れに以下のコマンドを実行して、タイルを見て、あなたのコンソール/端末で

#!/bin/bash 
src=$1 
width=`identify -format %w $src` 
limit=$[$width/256] 
echo "count = $limit * $limit = "$((limit * limit))" tiles" 
limit=$((limit-1)) 
for x in `seq 0 $limit`; do 
    for y in `seq 0 $limit`; do 
    tile=tile-$x-$y.png 
    echo -n $tile 
    w=$((x * 256)) 
    h=$((y * 256)) 
    convert -debug cache -monitor $src -crop 256x256+$w+$h $tile 
    done 
done 

:MPC画像と同じフォルダ内にtiler.shという名前のファイルを作成し、以下のスクリプトを入れました。

sh ./tiler.sh myLargeImg.mpc 
1

ImageMagickのは、単にタスクのこの種のために作られていないスクリプトです。あなたのような状況では、VIPSライブラリと関連フロントエンドNip2を使用することをお勧めします。

VIPSは非常にの大きな画像を扱うように特別に設計されています。

http://www.vips.ecs.soton.ac.uk/index.php?title=VIPS

+0

OSXのDMGは利用できなくなりました(404)私は簡単にGoogleを行なったし、それがライオン – abe

+0

@abeと互換性のないようです:どのようにソースからのコンパイルは? MacOXには完全なGNUツールチェーンが付属しています。 MacPortsなどでも見つかるかもしれません。 – datenwolf

+0

thxしかし、これは私が必要とするもののための非常に精巧なソリューションのように見えるドキュメントを通過した後 – abe

2

あなたはGDALプロジェクトからgdal_translateユーティリティを使用しようとするかもしれません。プロジェクト名の「地理空間」によって怖がらないでください。 GDALは、さまざまな形式のラスターデータにアクセスして処理する高度なライブラリです。地理空間ユーザー専用ですが、問題なく通常の画像処理にも使用できます。ここで

は大in.tif寸法のファイル40000x40000ピクセルから256×256ピクセルのタイルを生成するための簡単なスクリプトです:

#!/bin/bash 
width=40000 
height=40000 
y=0 
while [ $y -lt $height ] 
do 
    x=0 
    while [ $x -lt $width ] 
    do 
     outtif=t_${y}_$x.tif 
     gdal_translate -srcwin $x $y 256 256 in.tif $outtif 
     let x=$x+256 
    done 
    let y=$y+256 
done 

GDALバイナリほとんどのUnixライクなシステムのために利用可能なだけでなく、Windowsがdownloadableです。

+1

これはうまくいくかもしれませんが、私は既にimagemagickにかなりの時間を費やして作業していますので... thx – abe

6

libvipsには、非常に迅速にしたいことを正確に行うことができる演算子が追加されました。比較的小さなメモリでも可能です:1GB未満のメモリを使用して200,000 x 200,000ピクセルのスライド画像を定期的に処理します。

this answerを参照してください。

$ time convert -crop 512x512 +repage huge.tif x/image_out_%d.tif 
real 0m5.623s 
user 0m2.060s 
sys  0m2.148s 
$ time vips dzsave huge.tif x --depth 1 --tile-size 512 --overlap 0 --suffix .tif 
real 0m1.643s 
user 0m1.668s 
sys  0m1.000s 
+0

私はHerokuのvips(ruby-vipsの意味で)を使ってもいいですか? – microspino

関連する問題