我有一个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.8Gb
tif
,但vips resize
调用返回大小为1.8Gb
的tif
。
两张图像(显然)具有相同的尺寸32768x29657 pixels
,相同的分辨率72dpi
但bit depth
不同 来自vips thumbnail
的tif
具有24 bit depth
,而来自vips resize
16 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 构建图像处理操作的管道,以便程序将从您的输入中流式传输像素、放大它们并同时并行写入金字塔。它不会使用太多内存,而且会很快。