我正在尝试从巨大的图像创建瓷砖说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
答案 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专门用于处理非常大图像。