【问题标题】:PyCairo and modifying pixel dataPyCairo 和修改像素数据
【发布时间】:2018-12-20 10:00:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: python pycairo


    【解决方案1】:

    数据是原始像素数据。它是一个memoryview,代表底层ImageSurface。根据format,数据有一个不同的解释。

    为简单起见,我们只考虑 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")
    

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多