2012-05-10 2 views
4

Я пытаюсь создать плитки из огромного изображения говорит 40000x40000ImageMagick культуры огромного изображение

я нашел скрипт на линии для ImageMagick он обрежет плитку. он отлично работает на небольших изображениях, например, скажем, 10000x5000

Как только я получу больше, он заканчивается тем, что использует много памяти, и компьютер умирает.

Я добавил предельные варианты, но они не кажется, вступили в силу

у меня есть монитор там, но это не помогает, как сценарий просто замедляет и locksup машину

, кажется, просто goble up, как 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 Мне удалось заставить его работать.

Уловкой для ее работы является формат. Поскольку это собственный формат изображения, используемый ImageMagick, ему не нужно преобразовывать исходное изображение, оно просто вырезает кусок, который ему нужен. Это касается второго скрипта, который я настраиваю.

Допустим, у вас есть изображение 50000x50000.tif под названием myLargeImg.tif. Во-первых преобразовать его в родной формат изображения, используя следующую команду:

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

Затем запустите сильфона Баш скрипт, который будет создавать плитки.Создайте файл с именем tiler.sh в той же папке, что и MPC изображения и поставить ниже скрипт:

#!/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 

В вашей консоли/терминале запустите следующую команду и посмотреть плитки появляются по одному на время в свою папку.

sh ./tiler.sh myLargeImg.mpc 
1

ImageMagick просто не для такого рода задач. В таких ситуациях, как ваша, я рекомендую использовать библиотеку VIPS и соответствующий интерфейс Nip2

VIPS был разработан специально для очень больших изображений.

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

+0

OSX дамага больше не доступны (404) я сделал быстрый Google и, кажется, его не совместим с львом – abe

+0

@abe: Как насчет компиляции из исходных текстов? MacOX поставляется с полной GNU toolchain. Вы также можете найти его в MacPorts или аналогичном. – datenwolf

+0

thx, но после прохождения документов для этого это кажется очень сложным решением для чего мне нужно – abe

2

Вы можете попробовать использовать gdal_translate утилиту из GDAL проекта. Не пугайтесь «геопространственного» в названии проекта. GDAL - это расширенная библиотека для доступа и обработки растровых данных из различных форматов. Он предназначен для геопространственных пользователей, но его также можно использовать для обработки обычных изображений без каких-либо проблем.

Вот простой скрипт для создания 256x256 пикселов плитки из большого in.tif файла размеров 40000x40000 пикселей:

#!/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-подобных систем, а также окна downloadable.

+1

это может сработать, но я уже вложил немало времени в imagemagick, поэтому я получаю эту работу ... thx – abe

6

libvips теперь есть оператор, который может сделать именно то, что вы хотите очень быстро. Он также может делать это в относительно небольшой памяти: я регулярно обрабатываю 200 000 х 200 000 пикселей слайдов с использованием менее 1 ГБ памяти.

См. 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

Могу ли я использовать vips (по средству ruby-vips) на Heroku? – microspino