Python 更改GdkPixbuf(GTK3)中像素的颜色

Python 更改GdkPixbuf(GTK3)中像素的颜色,python,gtk,gtk3,pygobject,gdkpixbuf,Python,Gtk,Gtk3,Pygobject,Gdkpixbuf,我正在使用Gtk.StatusIcon,想更改一些像素的颜色;我有一段工作代码,它加载一个1x1像素的PNG文件和我想要设置的颜色,然后将其复制到图标Pixbuf。 虽然这是可行的,但它有一个明显的缺点,即必须为每种颜色创建1x1像素,因此我不能使用任意颜色,只能使用我为其创建图像的预定义颜色 如何将像素设置为任意RGBA颜色 我现在使用的代码(为了演示而简化): 我的下一次尝试是使用GdkPixbuf.Pixbuf.new_from_data,它看起来很有推广价值: fill = GdkPix

我正在使用
Gtk.StatusIcon
,想更改一些像素的颜色;我有一段工作代码,它加载一个1x1像素的PNG文件和我想要设置的颜色,然后将其复制到图标Pixbuf。
虽然这是可行的,但它有一个明显的缺点,即必须为每种颜色创建1x1像素,因此我不能使用任意颜色,只能使用我为其创建图像的预定义颜色

如何将像素设置为任意RGBA颜色

我现在使用的代码(为了演示而简化):

我的下一次尝试是使用
GdkPixbuf.Pixbuf.new_from_data
,它看起来很有推广价值:

fill = GdkPixbuf.Pixbuf.new_from_data(b'\xff\x00\xff', GdkPixbuf.Colorspace.RGB,
    False, 8, 1, 1, 3)
然而,这也不起作用。它不仅将像素设置为错误的颜色,而且在多次调用
set_icon()
时将其设置为不同的颜色<代码>打印(fill.get_pixels())给我
b'\x00\x00\x00'
。。。我用错了吗?我列出了各种不同的参数,但都给出了相同的结果

我还发现了一个C示例,它修改了
gdk_pixbuf_get_pixels()
的结果,因为它返回一个指向图像数据的指针。但这不是Python(AFAIK)所能做到的

我想要完成的一点背景知识:

我有一个小托盘应用程序来显示我的笔记本电脑的电池状态;它填充电池图标,以指示剩余电池电量。低于一定百分比时,颜色会从绿色变为红色(上面的例子就是这样),但我希望在这方面有更多的灵活性;例如,允许其他人设置自己的绿色,或使用紫色或其他颜色。

结果相当简单,但从阅读文档中一点也不明显:

# red, green, blue, alpha
color = 0xeeff2dff

# Create blank 1x1 image
fill = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 1, 1)

# Fill entire image with color
fill.fill(color)
我最初的解决方案,留作存档之用;这更复杂&不适用于透明性,但可能更适合于更高级的操作

经过更多的讨论,我最终使用了
GdkPixbuf.PixbufLoader.new\u,类型为
,来自:

list(map(lambda x: x.get_name(), GdkPixbuf.Pixbuf.get_formats()))
我选择了最简单的图像格式,它似乎是“便携式anymap格式”或
pnm

我用GIMP创建了一个简单的1x1图像,它提供了以下数据:

>>> open('test.pnm', 'rb').read()
b'P6\n# CREATOR: GIMP PNM Filter Version 1.1\n1 1\n255\n\xff\x00\xff'
最后3个字节(
\xff\x00\xff
)是我选择的颜色

我最后使用的完整示例如下:

color = b'\xee\xff\x2d'

px = GdkPixbuf.PixbufLoader.new_with_type('pnm')
px.write(b'P6\n\n1 1\n255\n' + color)
px.write(color)
px.close()
fill = px.get_pixbuf()
然后,我可以像原始示例一样使用
fill.copy\u area()

这是一个解决办法,但可以接受

PS.

从文档中可以看出,
GdkPixbuf.Pixbuf.new_From_data
看起来是实现这一点的最佳选择,但它似乎被破坏了。。。无论我做什么,我都不能让它工作…

这不是对你问题的直接回答,但你可以使用而不是操纵原始图像数据来实现你的目标。
>>> open('test.pnm', 'rb').read()
b'P6\n# CREATOR: GIMP PNM Filter Version 1.1\n1 1\n255\n\xff\x00\xff'
color = b'\xee\xff\x2d'

px = GdkPixbuf.PixbufLoader.new_with_type('pnm')
px.write(b'P6\n\n1 1\n255\n' + color)
px.write(color)
px.close()
fill = px.get_pixbuf()