【问题标题】:Create Vips Image from Numpy RGB array for big images从 Numpy RGB 数组为大图像创建 Vips 图像
【发布时间】:2023-03-29 05:10:01
【问题描述】:

我试图用 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

【问题讨论】:

    标签: python numpy vips


    【解决方案1】:

    您使用的是旧的 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 是免费的(我认为),所以它应该是有效的。 repo 中也有一个示例程序:

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

    【讨论】:

    • 修复了!谢谢你。
    • 很高兴它正在工作。我也尝试更新您基于此的问题。
    • 灰度图(只有一个通道):linear = image_matrix.astype(np.uint8).reshape(-1)im = pyvips.Image.new_from_memory(linear.data, image_matrix.shape[1], image_matrix.shape[0], bands=1, format="uchar")im.write_to_file('out.bmp')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2016-08-26
    • 2017-12-28
    相关资源
    最近更新 更多