我有一张图像,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
具有tif
而vips thumbnail
24 bit depth
中的一个。原始图像具有vips resize
。
此外,我了解16 bit depth
使用的算法在产生的文件大小中起着重要作用。当我使用bit depth=16
和/或vips translate
时可以设置算法吗?
答案 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构建了图像处理操作的流水线,因此程序将同时从您的输入流式处理像素,放大它们并写入金字塔。它不会占用太多内存,而且很快。