ImageMagick裁剪巨大的图像

时间:2012-05-10 21:14:03

标签: image bash image-processing imagemagick

我正在尝试从巨大的图像创建瓷砖说40000x40000

我在线上找到了一个用于imagemagick的脚本。它适用于小图像,如10000x5000

一旦我变得更大,它最终会使用大量内存并且计算机死机。

我添加了限制选项,但它们似乎没有影响

我有显示器,但它没有帮助,因为脚本只是放慢速度并锁定机器

它似乎只是像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

4 个答案:

答案 0 :(得分:7)

经过更多的挖掘和ImageMagick forum上的人的帮助后,我设法让它发挥作用。

让它运作的诀窍是.mpc格式。由于这是ImageMagick使用的原生图像格式,因此不需要转换初始图像,它只是剪掉了它所需的部分。我设置的第二个脚本就是这种情况。

假设您有一个名为50000x50000的{​​{1}} .tif图片。首先使用以下命令将其转换为本机图像格式:

myLargeImg.tif

然后,运行将创建切片的波纹管bash脚本。在与mpc图像相同的文件夹中创建名为 convert -monitor -limit area 2mb myLargeImg.tif myLargeImg.mpc 的文件,并放置以下脚本:

tiler.sh

在你的控制台/终端中运行以下命令,并观察一下你的文件夹中的图块。

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

答案 1 :(得分:7)

libvips有一个操作员可以非常快速地完成您想要的操作。文档introducing dzsave and explaining how it works中有一章。

它也可以在相对较小的内存中完成:我使用不到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 one --tile-size 512 --overlap 0 --suffix .tif
real    0m1.643s
user    0m1.668s
sys     0m1.000s

答案 2 :(得分:2)

您可以尝试使用gdal_translate项目中的GDAL实用程序。不要被项目名称中的“地理空间”吓跑。 GDAL是一个高级库,用于访问和处理各种格式的栅格数据。它专门用于地理空间用户,但它也可用于处理常规图像,没有任何问题。

以下是从尺寸为40000x40000像素的大型in.tif文件生成256x256像素图块的简单脚本:

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

答案 3 :(得分:1)

ImageMagick根本不是为这种任务而做的。在像你这样的情况下,我建议使用VIPS库和相关的前端Nip2

VIPS专门用于处理非常大图像。

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