使用libvips重新缩放图像

时间:2019-05-23 16:14:05

标签: image-processing vips

我有一张图像,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产生大小为tif的{​​{1}}时,2.8Gb调用返回大小为vips resize的{​​{1}}。

两个图像(显然)具有相同的尺寸tif,相同的分辨率1.8Gb但具有不同的32768x29657 pixels 72dpi中的bit depth具有tifvips thumbnail 24 bit depth中的一个。原始图像具有vips resize

此外,我了解16 bit depth使用的算法在产生的文件大小中起着重要作用。当我使用bit depth=16和/或vips translate时可以设置算法吗?

1 个答案:

答案 0 :(得分:2)

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构建了图像处理操作的流水线,因此程序将同时从您的输入流式处理像素,放大它们并写入金字塔。它不会占用太多内存,而且很快。