使用libvips调整图像大小

7

我有一张图片,尺寸为 6130x5548像素,我想将其重新缩放,使最长的一边为32768像素(然后创建一个7个缩放级别的瓦片金字塔)。我知道使用 vips resize 是这样做的显而易见的方法,因此我尝试了下面的命令行:

vips resize image_in.tif img_rescaled.tif 5.345513866231648

数字5.34551只是我的x轴上的比例32768/6130。如果我想要指定返回图像的确切尺寸(以像素为单位),该怎么做呢?

我尝试使用vips缩略图来实现此目的,我不知道这是否被建议使用,但它确实起作用。

vips thumbnail image_in.tif img_rescaled.tif 32768

这样可以吗?此外,这两种方法在文件大小方面有很大区别。虽然vips thumbnail生成了一个大小为2.8Gbtif文件,但vips resize呼叫却返回一个大小为1.8Gbtif

尽管这两个图像具有相同的尺寸 32768x29657 像素、相同的分辨率72dpi,但它们有不同的位深度。从vips thumbnail获取的tif24位深度,而从vips resize获取的则是16位深度。原始图像的位深度=16

此外,我了解到vips translate使用的算法对生成的文件大小起着重要作用。请问我是否可以在使用vips thumbnail和/或位深度时设置算法呢?


你能解释一下为什么需要在金字塔之前将图像放大六倍吗?否则,你会得到非常模糊的像素。vipsthumbnail 用于制作图像缩略图,因此它会将大多数图像转换为 sRGB 格式以便于 JPEG 保存。 - jcupitt
我有大约30万个点要在图像上绘制。除非您放大到比5级更深的层次,否则您只会看到一大堆标记。理想情况下,我想走得更远,达到8级,但7级是一个很好的妥协。背景图像的质量也不是至关重要的,我也可以在这方面做出妥协。因此,我可以使用“cubic”插值代替“lanczos”,这将导致稍小的文件大小,甚至可以使用“average”、“nearest”等质量较差但文件大小也较小的选项。 - Aenaon
仅仅是为了更好地解释我之前的评论,如果我理解正确的话,除非我的图像宽度或高度至少为32768像素,否则我无法制作7个缩放级别。在这种情况下,在第7级,一个单位将对应1个像素。如果有一种方法可以让“每像素单位=0.5”,那么将缩放到“16384像素”也对我来说没问题,但我不认为这是可能的使用vips - Aenaon
1个回答

8

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构建图像处理操作的管道,因此程序将同时从输入流式传输像素,放大它们并编写金字塔,全部并行进行。 它不会使用太多内存,速度也很快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接