python - PyCairo 和修改像素数据
问题描述
我正在使用PyCairo从 Python 脚本中以编程方式绘制一些矢量图像。它工作正常。但现在我想访问像素数据并在像素级别对它们进行进一步处理(例如模糊或其他光栅效果),然后继续使用 PyCairo 的图像表面绘制更多矢量形状。
我get_data()
在课堂上找到了该方法cairo.ImageSurface
,但我不确定如何使用它,因为文档对此非常神秘。它只是说它返回一个称为“Python 缓冲区”的东西,但是没有代码示例说明如何在实际应用程序中实际使用它。
谁能提供一个示例代码,说明如何在“Python 缓冲区”thingamajig 中获取这些像素的抓地力?(最好不需要从/到 PyCairo 表面来回复制整个图像)。
解决方案
数据是原始像素数据。这是一个代表底层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")
推荐阅读
- flutter - Flutter:使用 AutoRoute 添加自定义转换
- android - 在 android studio 中构建项目时出错 - 无法下载 aapt2-3.5.3-5435860-windows.jar
- swift - 为单个项目搜索多个数组的更有效方法?
- html - HTML CSS 背景在顶部被截断
- python - 使用 pd.merge() 合并两个以上的数据帧
- javascript - 在 Docker 中使用本地卷共享运行 Gatsby
- android - ViewModel 永远不应该引用视图。如果你这样做,那么你会得到内存泄漏。如何不违反这条规则?
- rust - 如何返回对可选结构字段中值的引用?
- php - 如何从套接字消息(PHP)中获取 cookie?
- python - 如何删除列表中重复数字的所有实例?