可以告诉我如何使用PyGI(或PyGTK)更改图像颜色吗? 我需要方法或属性,比如CEGUI中的“ImageColour”,改变图像的非alpha通道。例如: 我有一张照片,它只是白色的圆形。我需要在不同颜色的界面的不同位置使用这一轮。而且我不打算创建这一轮的另一个共同体,例如,我需要256种不同的颜色。 和图片示例:
This is picture with white round, what I've got
This is picture with round, what color I want to see
这是函数,我用来改变颜色:
image = gtk.Image()
image.set_from_file("images/button.png")
pix_buffer = image.get_pixbuf()
pix_buffer.fill(0xA32432FF)
image.set_from_pixbuf(pix_buffer)
多数民众赞成无法正常运作。多数民众赞成将图像填充为四色红色。
另一个想法是 modify_fg / modify_base ,但这里仅适用于 modify_bg 只改变背景的内容(并且不会改变白色)< / p>
答案 0 :(得分:0)
我在最后几天一直在玩这个,并且将pixbuf
视为像素的直接表示并不是一件容易的事。其中一个原因是GdkPixbuf
软件确定了'rowstride',导致图像寻址中的“跳跃”。
直到我可以调查更多,我发现最简单的解决方案是将pixbuf转换为PIL.Image
,在那里进行操作,然后转换回pixbuf。这些是进行转换的两个函数:
def pixbuf2image(self, pxb):
""" Convert GdkPixbuf.Pixbuf to PIL image """
data = pxb.get_pixels()
w = pxb.get_width()
h = pxb.get_height()
stride = pxb.get_rowstride()
mode = "RGB"
if pxb.get_has_alpha():
mode = "RGBA"
img = Image.frombytes(mode, (w, h), data, "raw", mode, stride)
return img
def image2pixbuf(self, img):
""" Convert PIL or Pillow image to GdkPixbuf.Pixbuf """
data = img.tobytes()
w, h = img.size
data = GLib.Bytes.new(data)
pxb = GdkPixbuf.Pixbuf.new_from_bytes(data, GdkPixbuf.Colorspace.RGB,
False, 8, w, h, w * 3)
return pxb
幸运的是,new_from_bytes
会自动考虑行数,并以正确的方式将data
中的连续字节保存在内存中。
在PIL
(Python3的Pillow
)中,您可以对图像执行许多操作,包括逐像素访问。请注意pixbuf
始终使用RGB(A)
个组件,因此您必须小心转换和操作!
在任何情况下,如果您想直接构建图像,后一个函数会显示如何将内存(bytes
)数组转换为GdkPixbuf
。