使用 libvips 重新缩放图像

Aen*_*aon 6 image-processing vips

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

vips resize image_in.tif img_rescaled.tif 5.345513866231648
Run Code Online (Sandbox Code Playgroud)

数字5.34551只是比率32768/6130,沿 my 的比例因子x axis。如果我想指定返回图像的像素的确切尺寸,我该怎么做?

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

vips thumbnail image_in.tif img_rescaled.tif 32768
Run Code Online (Sandbox Code Playgroud)

请问这样可以吗?

此外,这两种方法在 MB 大小方面给出了完全不同的输出。虽然vips thumbnail产生了tif与尺寸2.8Gbvips resize调用返回一个tif与大小1.8Gb

这两个图像有(显然)相同尺寸32768x29657 pixels,相同的分辨率72dpi,但不同bit depthtif距离 vips thumbnail24 bit depth,而从一个vips resize 16 bit depth。原图有bit depth=16

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

jcu*_*itt 6

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
Run Code Online (Sandbox Code Playgroud)

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

vips colourspace thing.tif other.tif srgb
Run Code Online (Sandbox Code Playgroud)

制作 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')
Run Code Online (Sandbox Code Playgroud)

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