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)
经过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)
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)