5

我正在尝试从一个巨大的图像创建瓷砖,比如 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

4 回答 4

7

经过更多的挖掘和ImageMagick 论坛上的人的一些帮助后,我设法让它工作。

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

假设您有一个50000x50000 .tif名为myLargeImg.tif. 首先使用以下命令将其转换为本机图像格式:

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

然后,运行将创建瓷砖的波纹管 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

在您的控制台/终端中运行以下命令,然后观察图块一次出现一个到您的文件夹中。

 sh ./tiler.sh myLargeImg.mpc
于 2012-05-14T12:15:28.653 回答
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
于 2013-03-08T12:20:39.417 回答
2

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

in.tif这是从40000x40000 像素的大文件生成 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 。

于 2012-05-10T22:46:44.527 回答
1

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

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

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

于 2012-05-10T21:23:50.600 回答