我有一个函数,可以从 RGBA 图像中剪切出形状,方法是将图像转换为 pycairo 表面,从表面剪切出形状,然后将其传输到不同的 pycairo 表面。
这工作正常,因为我尝试保存为 png 来检查图像。但是,我想将新 pycairo 表面中的图像用作数组。
这就是我为实现这一目标而尝试做的事情:
surface2 = surface.create_for_rectangle(x_min*scale,y_min*scale,width,height)
buf = surface2.get_data()
crop = np.ndarray(shape = (math.ceil(height),math.ceil(width),4), dtype = np.uint8, buffer=buf)
return crop
此解决方案取自 pycairo 官方文档。这对于
surface
可以正常工作,但对于 surface2
则不行。我认为这与 create_for_rectangle()
函数有关。我想到的另一个解决方案是将 surface2
写入 png,然后使用 cv2.imread()
来获取它,但这似乎很粗糙。
我无法找到
create_for_rectangle()
与 get_data()
互动的答案。然而,作为我打算做的事情的解决方案,我这样做了:
surface2 = cairo.ImageSurface(cairo.FORMAT_ARGB32, round(width), round(height))
ctx2 = cairo.Context(surface2)
ctx2.set_source_surface(surface, -x_min*scale, -y_min*scale)
ctx2.paint()
surface2
现在可以按预期与 get_data()
一起工作,并且我现在能够正确获取与 surface2
关联的 numpy 数组。