从 Numpy RGB 数组为大图像创建 Vips 图像

Create Vips Image from Numpy RGB array for big images

我试图用 PIL/Pillow 输出生成的大图像,但当图像尺寸变大时它会中断。

因此,根据我在 SO 上阅读的内容,我正在尝试使用 Vips。

我生成的数据是一个 RGB 值的 numpy 数组。我想在 Vips 中将其转换为图像以便保存。但是我不知道如何将像素数据导入 Vips。

import numpy
import gi
gi.require_version('Vips', '8.0')
from gi.repository import Vips

WIDTH=32768
HEIGHT=32768
UCHAR=Vips.BandFormat.UCHAR

# Create an RGB black image
black_space = numpy.zeros( ( WIDTH, HEIGHT, 3 ), dtype=numpy.uint8 )

# this doesn't work
vips_image = Vips.Image.new_from_memory( black_space, WIDTH, HEIGHT, bands=3, format=UCHAR )
vips_image.write_to_file( "space_32k.tiff" )

当然创建Vips镜像失败了,报错:

Traceback (most recent call last):
  File "./bad_vips.py", line 14, in <module>
    vips_image = Vips.Image.new_from_memory( black_space, WIDTH, HEIGHT, bands=3, format=UCHAR )
TypeError: Item 0: expected int argument

有没有一种方法可以转换 numpy 数组以便它与 Vips 一起使用?

我也试过通过 black_space.data,但后来我得到:

NotImplementedError: Item 0: multi-dimensional sub-views are not implemented

您使用的是旧的 libvips Python 界面 -- 现在有一个更新的界面,它要好得多:

https://github.com/libvips/pyvips

此处的文档:

https://libvips.github.io/pyvips/

a section 关于链接 libvips 和 numpy。你的例子是:

import numpy
import pyvips

WIDTH = 100
HEIGHT = 100

# Create an RGB black image
black_space = numpy.zeros((WIDTH, HEIGHT, 3), dtype=numpy.uint8)

# reshape into a huge linear array
linear = black_space.reshape(WIDTH * HEIGHT * 3)

vips_image = pyvips.Image.new_from_memory(linear.data, \
        WIDTH, HEIGHT, bands=3, format="uchar")

vips_image.write_to_file("huge.tif")

reshape是免费的(我认为),所以应该是高效的。回购协议中也有一个示例程序:

https://github.com/libvips/pyvips/blob/master/examples/pil-numpy-pyvips.py