使用 libvips 重新缩放图像



我有一个6130x5548 pixels的图像,我想重新缩放它,以便最长的边32768 pixels(然后做一个具有 7 个缩放级别的瓷砖金字塔)。我认为vips resize是这样的事情的明显方法,因此我尝试了下面的行

vips resize image_in.tif img_rescaled.tif 5.345513866231648

5.34551的数字只是32768/6130的比例,沿我x axis的比例因子。如果我想指定重新调整的图像的确切尺寸(以像素为单位),请问我该怎么做?

我试图为此目的使用vips thumbnail,我不知道这是否被推荐,但它确实有效。

vips thumbnail image_in.tif img_rescaled.tif 32768

请问这样的事情可以吗?

此外,这两种方法在 MB 大小方面给出了完全不同的输出。虽然vips thumbnail生成大小2.8Gbtif,但vips resize调用返回大小为1.8Gbtif

两张图像(显然)具有相同的尺寸32768x29657 pixels,相同的分辨率72dpibit depth不同 来自vips thumbnailtif具有24 bit depth,而来自vips resize16 bit depth的具有。原始图像具有bit depth=16

另外,我知道vips translate使用的算法对生成的文件大小起着重要作用。我可以在使用vips thumbnail和/或bit depth时设置算法吗?

resize只采用比例因子,因此您需要对其进行计算。您可以使用以下内容:

width=$(vipsheader -f width somefile.tif)
height=$(vipsheader -f height somefile.tif)
size=$((width > height ? width : height))
factor=$(bc <<< "scale=10; 32768 / $size")
vips resize somefile.tif huge.tif $factor

在升级之前,我会使用 8 位,因为您只需要 8 位用于显示。您可以使用:

vips colourspace thing.tif other.tif srgb

制作 8 位 srgb 版本。

当你开始做这样的事情时,bash变得如此丑陋,以至于我很想切换到pyvips。

import pyvips
image = pyvips.Image.new_from_file('somefile.tif', access='sequential')
image = image.colourspace('srgb')
image = image.resize(32768 / max(image.width, image.height))
image.dzsave('mypyramid')

它还有一个额外的优势,那就是它不会使用任何临时文件。 pyvips 构建图像处理操作的管道,以便程序将从您的输入中流式传输像素、放大它们并同时并行写入金字塔。它不会使用太多内存,而且会很快。

相关内容

  • 没有找到相关文章

最新更新