在 Pyglet 中设置单个像素

ktd*_*drv 1 python pyglet

有没有办法在 Pyglet 中为图像数据设置单个像素值?

我想也可以通过将OpenGL渲染模式设置为点来完成,所以如果有人对此有见解,也请分享。

J. *_*kel 5

最终对我来说最合适的解决方案是使用ImageData每个AbstractImage子类附带的类。

ImageData 数组检索

所述ImageData类表示图像作为一个字节数组,或者更精确地,其中的每个字符表示所期望的颜色空间中的坐标的字符串。

要获得给定的字节表示image,您可以调用

image_data = image.get_image_data()
width = image_data.width
data = image_data.get_data('RGB', 3*width)
Run Code Online (Sandbox Code Playgroud)

我们在get_data这里传递的第二个参数是我们期望为图像的每一行获得的字节数。因为我们希望每个像素都有 R、G 和 B 的所有分量,所以我们希望图像宽度是其 3 倍。如果我们只对每个像素的强度感兴趣,我们将传递参数('I', image.width)这是一些官方文档

要仅获取您感兴趣的像素的值,例如(x,y),您可能想要这样做:

pos = (width*y + x) * 3  
rgb = map(ord, data[pos:pos+3])
Run Code Online (Sandbox Code Playgroud)

除了检索ImageData整个图像的 并在之后选择所需的像素值之外,您还可以调用get_image_data()某个区域,即所需位置的 1x1 像素:

image_data = image.get_region(x,y,1,1).get_image_data()
Run Code Online (Sandbox Code Playgroud)

这就是谷歌群组帖子的完成方式,您还可以在其中找到有用的信息,即获取图像数据似乎更有效,RGBA而不是RGB.

设置单个像素

现在,为了最终回答问题,还有一个用于 ImageData, 的图像字节数据的 setter 方法set_data,它的工作方式正好相反。

image_data.set_data('RGB', image.width*3, data)
Run Code Online (Sandbox Code Playgroud)

这可能也适用于区域,但我还没有尝试过。如果要设置存储在整数数组中的字节数据,请传递''.join(map(chr, data)). 不知道有没有办法设置数值。

希望这可以帮助任何在这个相当古老的问题上绊倒的人,这恰好是某些搜索词的突出谷歌结果。