我使用Gtk.StatusIcon
,並且想要更改某些像素的顏色;我有一段代碼,用一個我想要設置的顏色加載一個1x1像素的PNG文件,然後將它複製到圖標Pixbuf中。
儘管這樣做有效,但它有一個明顯的缺點,即必須爲每種顏色創建1x1像素,因此我無法使用任意顏色,只能使用爲圖像創建的預定義顏色。更改GdkPixbuf(GTK3)中像素的顏色
如何將像素設置爲任意RGBA顏色?
我現在使用的代碼(簡化用於演示目的):我試圖創建與GdkPixbuf.PixbufLoader
一個新的pixbuf對象,但這似乎期待一個PNG圖像,而不是一個字節對象
#!/usr/bin/env python
from gi.repository import Gtk, GLib, GdkPixbuf
def set_icon_cb(widget, data=None):
set_icon(widget)
def set_icon(icon):
fill_amount = 20
img = GdkPixbuf.Pixbuf.new_from_file('./data/icons/battery.png')
fill = GdkPixbuf.Pixbuf.new_from_file('./data/icons/green.png')
for row_num, row in enumerate(zip(*(iter(img.get_pixels()),) *img.get_rowstride())):
# Blank row
if 255 not in row: continue
for col_num, pixel in enumerate(zip(*(iter(row),) * 4)):
r, g, b, a = pixel
if col_num > 2 and col_num <= fill_amount and a == 0:
fill.copy_area(0, 0, 1, 1, img, col_num, row_num)
icon.set_from_pixbuf(img)
icon = Gtk.StatusIcon()
icon.connect('activate', set_icon_cb)
set_icon(icon)
Gtk.main()
,所以這是不是非常有幫助:
fill = GdkPixbuf.PixbufLoader()
fill.write(b'\x88\x88\x88\xff')
fill.close()
fill = fill.get_pixbuf()
# Gives error:
# GLib.Error: gdk-pixbuf-error-quark: Unrecognized image file format (3)
我的下一個嘗試是使用GdkPixbuf.Pixbuf.new_from_data
,看上去promossing:
fill = GdkPixbuf.Pixbuf.new_from_data(b'\xff\x00\xff', GdkPixbuf.Colorspace.RGB,
False, 8, 1, 1, 3)
但是,這也不起作用。它不僅會將像素設置爲錯誤的顏色,還會在多個調用set_icon()
中將其設置爲不同的顏色; print(fill.get_pixels())
給我b'\x00\x00\x00'
...我使用這個錯誤嗎?我綁了各種不同的參數,但都給出了相同的結果...
我還發現一個C示例修改了gdk_pixbuf_get_pixels()
的結果,因爲這返回了一個指向圖像數據的指針。但這不是Python中可以做的事(AFAIK)。
我想要實現的一點背景:
我有一個小托盤應用程序來顯示筆記本電腦的電池狀態;它會填充電池圖標以指示剩餘電池電量。低於一定比例的顏色會從綠色變爲紅色(這與上面的例子一致),但我想在這方面有更多的靈活性;例如。讓其他人可以設置自己的綠色陰影,或使用紫色或其他任何東西。
這不是一個直接回答你的問題,但您可以使用[符號圖標](https://developer.gnome.org/gtk3/stable/GtkIconTheme.html#gtk-icon-info-load-symbolic)完成目標,而不是操作原始圖像數據。 – ptomato 2014-11-05 04:31:45