ImageMagick裁剪巨大的图像

abe*_*abe 4 bash image imagemagick image-processing

我试图从一个巨大的图像创建瓷砖说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
Run Code Online (Sandbox Code Playgroud)

abe*_*abe 7

经过ImageMagick论坛上的人们的更多挖掘和帮助后,我设法让它运转起来.

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

让我们说你有一个50000x50000 .tif叫做的图像myLargeImg.tif.首先使用以下命令将其转换为本机图像格式:

 convert -monitor -limit area 2mb myLargeImg.tif myLargeImg.mpc
Run Code Online (Sandbox Code Playgroud)

然后,运行将创建切片的波纹管bash脚本.创建一个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
Run Code Online (Sandbox Code Playgroud)

在您的控制台/终端中运行以下命令,并观察磁贴一次出现在您的文件夹中.

 sh ./tiler.sh myLargeImg.mpc
Run Code Online (Sandbox Code Playgroud)


jcu*_*itt 7

libvips有一个操作员,可以非常快速地完成您想要的操作.文档中有一章介绍dzsave并解释它是如何工作的.

它也可以在相对较小的内存中完成:我使用不到1GB的内存定期处理200,000 x 200,000像素的幻灯片图像.

看到这个答案,但简单地说:

$ 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
Run Code Online (Sandbox Code Playgroud)