首页 > 解决方案 > PyCairo 和修改像素数据

问题描述

我正在使用PyCairo从 Python 脚本中以编程方式绘制一些矢量图像。它工作正常。但现在我想访问像素数据并在像素级别对它们进行进一步处理(例如模糊或其他光栅效果),然后继续使用 PyCairo 的图像表面绘制更多矢量形状。

get_data()在课堂上找到了该方法cairo.ImageSurface,但我不确定如何使用它,因为文档对此非常神秘。它只是说它返回一个称为“Python 缓冲区”的东西,但是没有代码示例说明如何在实际应用程序中实际使用它。

谁能提供一个示例代码,说明如何在“Python 缓冲区”thingamajig 中获取这些像素的抓地力?(最好不需要从/到 PyCairo 表面来回复制整个图像)。

标签: pythonpycairo

解决方案


数据是原始像素数据。这是一个代表底层ImageSurface的memoryview。数据根据格式不同的解释。

为简单起见,我们只考虑 RGB24 像素格式。每个像素存储为四个字节。分别是红色、绿色和蓝色。第四个字节被忽略,只是出于性能原因。

然后逐行存储像素,第一行在前,第二行在后,依此类推。

行尾也可能有额外的填充,因此数据的步幅是一个关键属性。为了获得特定行的字节索引,y我们需要计算y * stride. 为此,我们添加一个x坐标乘以像素字节宽度 4。

这一切都在以下小 Python 程序中进行了说明,该程序在黑色背景上绘制了一个白色矩形。

import cairo
width, height = 100, 100
surface = cairo.ImageSurface(cairo.Format.RGB24, width, height)
data = surface.get_data()
for y in range(50 - 20, 50 + 20):
    for x in range(50 - 20, 50 + 20):
        index = y * surface.get_stride() + x * 4
        data[index] = 255  # red
        data[index + 1] = 255  # green
        data[index + 2] = 255  # blue
surface.write_to_png("im.png")

推荐阅读